如何使go vet、gofmt和其他Go linter工具忽略vendor/中的第三方文件,最好是具有准确的累积退出状态?
例如,find . -name vendor -prune -o -name '*.go' -exec gofmt -s -w {} \;是否会呈现有意义的退出状态?
发布于 2016-11-11 05:16:51
我通常是这样做的
go fmt $(go list ./... | grep -v /vendor/)
go test $(go list ./... | grep -v /vendor/)但是自从我开始使用govendor,我发现我可以用govendor做同样的事情,只需要更少的输入
govendor fmt +l // +l is shorthand for local发布于 2016-11-11 00:28:37
通常go list比find更有帮助:
$ go list ./...
arp242.net/trackwall
arp242.net/trackwall/cmdline
arp242.net/trackwall/vendor/arp242.net/sconfig
arp242.net/trackwall/vendor/bitbucket.org/pkg/inflect
[..trim..]如您所见,这将列出当前目录中的所有包名称。我们可以使用grep来过滤vendor目录
$ go list ./... | grep -v /vendor/
arp242.net/trackwall
arp242.net/trackwall/cmdline如果您想运行几个linter,报告所有错误,并仅在成功时返回0,则可以使用循环和状态变量:
#!/bin/sh
st=0
for pkg in $(go list ./... | grep -v /vendor/); do
echo "==> $pkg"
go vet "$pkg"
[ $? -ne 0 ] && st=1
golint "$pkg"
[ $? -ne 0 ] && st=1
# gofmt works on files, not packages
gofmt -d "${f#arp242.net/trackwall}"*.go
[ $? -ne 0 ] && st=1
done
exit $st它将输出类似如下的内容:
==> arp242.net/trackwall
http.go:71: database/sql.NullString composite literal uses unkeyed fields
exit status 1
/home/martin/gocode/src/arp242.net/trackwall/http.go:70:2: don't use ALL_CAPS in Go names; use CamelCase
/home/martin/gocode/src/arp242.net/trackwall/http.go:75:9: if block ends with a return statement, so drop this else and outdent its block
==> arp242.net/trackwall/cmdline
Exit 1当然,你并不是第一个有这个问题的人,而且有一些工具基本上和上面的一样,只是更好。gometalinter可能是最广为人知的,我建议您使用这个。它包含一个--vendor开关来忽略供应商目录,这很有帮助:
$ go get -u github.com/alecthomas/gometalinter
$ gometalinter --vendor ./...
helpers.go:25:1:warning: realpath is unused (deadcode)
http.go:32:1:warning: _list is unused (deadcode)
[..trim..]发布于 2016-11-29 02:36:44
https://stackoverflow.com/questions/40531874
复制相似问题