Luacheck
Luacheck使用手册
1.为什么要使用luacheck:
诚然,lua作为一门解释型脚本语言,确实给开发带来了极大的便利,然而随之而来的问题也让人苦恼。很多问题代码都难以直接发现,例如:
- 崩溃
- 死循环
- 不恰当的全局变量,全局函数
- unused变量
- 使用未定义变量,或函数
- 其他不规范代码,如单行代码太长
以上问题,虽然程序员通过养成良好的编码风格可以一定程度上减少,然而人都是不可靠的,所谓百密一疏,疏忽的问题最后都会变成线上问题,烦!
2.那么,什么是luacheck?
luacheck是lua的静态检测工具,Xcode的Analyze,c语言的Valgrind一样,都是一个代码检测的辅助工具,用于帮你检查代码中的问题,防止问题带到线上
luacheck的获取与使用
luacheck是开源的:https://github.com/mpeterv/luacheck,支持编辑器扩展,支持多平台
由于笔者平时使用linux环境,现大致记录下linux环境下的一些使用:
- 下载源码
- 解压,进入luacheck目录(由于笔者直接下载的master分支,所以路径是 luacheck-mast)
- 运行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.
- 进入
/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/
既已览卷至此,何不品评一二: