Luacheck使用手册

1.为什么要使用luacheck:

诚然,lua作为一门解释型脚本语言,确实给开发带来了极大的便利,然而随之而来的问题也让人苦恼。很多问题代码都难以直接发现,例如:

  1. 崩溃
  2. 死循环
  3. 不恰当的全局变量,全局函数
  4. unused变量
  5. 使用未定义变量,或函数
  6. 其他不规范代码,如单行代码太长

以上问题,虽然程序员通过养成良好的编码风格可以一定程度上减少,然而人都是不可靠的,所谓百密一疏,疏忽的问题最后都会变成线上问题,烦!

2.那么,什么是luacheck?

luacheck是lua的静态检测工具,Xcode的Analyze,c语言的Valgrind一样,都是一个代码检测的辅助工具,用于帮你检查代码中的问题,防止问题带到线上

luacheck的获取与使用

luacheck是开源的:https://github.com/mpeterv/luacheck,支持编辑器扩展,支持多平台

由于笔者平时使用linux环境,现大致记录下linux环境下的一些使用:

  1. 下载源码
  2. 解压,进入luacheck目录(由于笔者直接下载的master分支,所以路径是 luacheck-mast)
  3. 运行install.lua ,作用是将必要文件拷贝到指定path目录,或系统目录, 例如笔者输入:lua install.lua /home/username/testluacheck/ 将会看到如下打印信息:
    Detected POSIX environment
    Writing luacheck executable to bin/luacheck
        Running chmod +x "bin/luacheck" >/dev/null
    Installing luacheck modules into /home/mengyun/testluacheck//src
        Running mkdir -p "/home/mengyun/testluacheck//src/luacheck" >/dev/null
        Running cp "src/luacheck/main.lua" "/home/mengyun/testluacheck//src/luacheck" >/dev/null
        Running cp "src/luacheck/init.lua" "/home/mengyun/testluacheck//src/luacheck" >/dev/null
        Running cp "src/luacheck/config.lua" "/home/mengyun/testluacheck//src/luacheck" >/dev/null
        Running cp "src/luacheck/linearize.lua" "/home/mengyun/testluacheck//src/luacheck" >/dev/null
        Running cp "src/luacheck/analyze.lua" "/home/mengyun/testluacheck//src/luacheck" >/dev/null
        Running cp "src/luacheck/reachability.lua" "/home/mengyun/testluacheck//src/luacheck" >/dev/null
        Running cp "src/luacheck/core_utils.lua" "/home/mengyun/testluacheck//src/luacheck" >/dev/null
        Running cp "src/luacheck/check.lua" "/home/mengyun/testluacheck//src/luacheck" >/dev/null
        Running cp "src/luacheck/parser.lua" "/home/mengyun/testluacheck//src/luacheck" >/dev/null
        Running cp "src/luacheck/lexer.lua" "/home/mengyun/testluacheck//src/luacheck" >/dev/null
        Running cp "src/luacheck/filter.lua" "/home/mengyun/testluacheck//src/luacheck" >/dev/null
        Running cp "src/luacheck/options.lua" "/home/mengyun/testluacheck//src/luacheck" >/dev/null
        Running cp "src/luacheck/inline_options.lua" "/home/mengyun/testluacheck//src/luacheck" >/dev/null
        Running cp "src/luacheck/builtin_standards.lua" "/home/mengyun/testluacheck//src/luacheck" >/dev/null
        Running cp "src/luacheck/love_standard.lua" "/home/mengyun/testluacheck//src/luacheck" >/dev/null
        Running cp "src/luacheck/expand_rockspec.lua" "/home/mengyun/testluacheck//src/luacheck" >/dev/null
        Running cp "src/luacheck/multithreading.lua" "/home/mengyun/testluacheck//src/luacheck" >/dev/null
        Running cp "src/luacheck/cache.lua" "/home/mengyun/testluacheck//src/luacheck" >/dev/null
        Running cp "src/luacheck/format.lua" "/home/mengyun/testluacheck//src/luacheck" >/dev/null
        Running cp "src/luacheck/version.lua" "/home/mengyun/testluacheck//src/luacheck" >/dev/null
        Running cp "src/luacheck/fs.lua" "/home/mengyun/testluacheck//src/luacheck" >/dev/null
        Running cp "src/luacheck/globbing.lua" "/home/mengyun/testluacheck//src/luacheck" >/dev/null
        Running cp "src/luacheck/utils.lua" "/home/mengyun/testluacheck//src/luacheck" >/dev/null
        Running cp "src/luacheck/argparse.lua" "/home/mengyun/testluacheck//src/luacheck" >/dev/null
        Running cp "src/luacheck/whitespace.lua" "/home/mengyun/testluacheck//src/luacheck" >/dev/null
        Running cp "src/luacheck/detect_globals.lua" "/home/mengyun/testluacheck//src/luacheck" >/dev/null
        Running cp "src/luacheck/standards.lua" "/home/mengyun/testluacheck//src/luacheck" >/dev/null
        Running cp "src/luacheck/lua_fs.lua" "/home/mengyun/testluacheck//src/luacheck" >/dev/null
        Running cp "src/luacheck/lfs_fs.lua" "/home/mengyun/testluacheck//src/luacheck" >/dev/null
    Installing luacheck executables into /home/mengyun/testluacheck//bin
        Running mkdir -p "/home/mengyun/testluacheck//bin" >/dev/null
        Running cp "bin/luacheck" "/home/mengyun/testluacheck//bin" >/dev/null
        Running cp "bin/luacheck.lua" "/home/mengyun/testluacheck//bin" >/dev/null

    Installed luacheck 0.20.0 into /home/mengyun/testluacheck/.
    Please ensure that /home/mengyun/testluacheck//bin is in PATH.
  1. 进入/bin 路径,即可看到luacheck程序

3.luacheck简单测试:

编写如下测试代码:

-----------test.lua
 print("helloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworld")
 
 local a,b,c
  
 g_a = 1
  
 local tb = require("head")
 for k,v in pairs(tb) do
    print("v==",v)
 end
 
 function testfunc(a,b)
    print("1"..a)
 end
----------head.lua
local tb = {1,2,3,4,5,6}
return tb

运行 lua test.lua,发现一切正常:

  • helloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworld
  • v== 1
  • v== 2
  • v== 3
  • v== 4
  • v== 5
  • v== 6

但是,使用./luacheck test.lua 就发现如下问题提示:

Checking test/test.lua 11 warnings

test.lua:1:1: line is too long (139 > 120)
test.lua:3:7: unused variable a
test.lua:3:9: unused variable b
test.lua:3:11: unused variable c
test.lua:5:1: setting non-standard global variable g_a
test.lua:8:5: unused loop variable k
test.lua:8:24: line contains trailing whitespace
test.lua:12:10: setting non-standard global variable testfunc
test.lua:12:19: shadowing upvalue a on line 3
test.lua:12:21: unused argument b
test.lua:12:21: shadowing upvalue b on line 3

大概就是例如:单行代码太长、未使用的变量a、非标准全局变量g_a、未使用的循环变量等错误等,并且问题对应的代码位置也已经给出,很方便改掉

4.屏蔽错误提醒

luacheck的检测是非常严格的,有些错误在某些情况下是可以忽略的,需将这类提醒去掉

例如:屏蔽test.lua:3:7: unused variable a这类错误:./luacheck test.lua -u 则只能看到如下问题提示:

Checking test/test.lua 6 warnings

test/test.lua:1:1: line is too long (139 > 120)
test/test.lua:5:1: setting non-standard global variable g_a
test/test.lua:8:24: line contains trailing whitespace
test/test.lua:12:10: setting non-standard global variable testfunc
test/test.lua:12:19: shadowing upvalue a on line 3
test/test.lua:12:21: shadowing upvalue b on line 3

又例如,去掉当行代码长度限制:./luacheck test/test.lua –no-max-line-length 你将看不到:test.lua:1:1: line is too long (139 > 120)提示

5.更多信息:

https://github.com/mpeterv/luacheck

http://luacheck.readthedocs.io/en/stable/