Go 如何使过梁忽略供应商/?
我们如何使Go 如何使过梁忽略供应商/?,go,Go,我们如何使go-vet、gofmt和其他go-linter工具忽略供应商/中的第三方文件,最好是具有准确、累积的退出状态 例如,find-名称vendor-prune-o-name'*.go'-exec gofmt-s-w{}显示有意义的退出状态?您可以将所有源代码放入子目录中(例如,内部或库)。或者,您可以执行以下操作: go vet ./... | grep -v vendor/ && exit 1 || exit 0 通常go list比find更有用: $ go lis
go-vet
、gofmt
和其他go-linter工具忽略供应商/
中的第三方文件,最好是具有准确、累积的退出状态
例如,
find-名称vendor-prune-o-name'*.go'-exec gofmt-s-w{}代码>显示有意义的退出状态?您可以将所有源代码放入子目录中(例如,内部
或库
)。或者,您可以执行以下操作:
go vet ./... | grep -v vendor/ && exit 1 || exit 0
通常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
:
$ 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
当然,你不是第一个遇到这个问题的人,有一些工具基本上和上面的一样,只是更好。可能是最有名的,我建议你用这个。它包括一个--vendor
开关,用于忽略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..]
我以跨平台的方式执行此操作philea-s“666 go vet%s”“666 go fmt fail%s”
产量
$ ls -alh | grep ven
drwxr-xr-x 5 mh-cbon mh-cbon 4,0K 14 juin 20:43 vendor
$ philea -s "666 go vet %s" "666 go-fmt-fail %s"
go-fmt-fail ./local/local.go
✔ Success
go-fmt-fail ./dl/index.go
✔ Success
go vet ./local/local.go
✔ Success
go-fmt-fail ./gh/gh.go
✔ Success
go vet ./main.go
✔ Success
go vet ./gh/gh.go
✔ Success
go vet ./dl/index.go
✔ Success
go-fmt-fail ./main.go
✔ Success
我通常这样做
go fmt $(go list ./... | grep -v /vendor/)
go test $(go list ./... | grep -v /vendor/)
但是自从我开始使用Govendo以来,我发现我可以用Govendo做同样的事情,只需少打字
govendor fmt +l // +l is shorthand for local
谢谢你所有有用的建议!这对我来说很有用:
随着Go 1.10(2018年第1季度)的推出,s提到的功能将更加强大:
go list ./... | grep -v vendor | xargs go vet -v
如中所示,依赖于(尚未编译的)供应商软件包的软件包上的go vet
将失败:
==> arp242.net/trackwall
http.go:71: database/sql.NullString composite literal uses unkeyed fields
注意了,因为已经解决了
见:
去看兽医
“go-vet
”命令最适用于它正在分析的包的完整类型信息。从历史上看,这在各种情况下都是有问题的:使用cgo
的软件包、使用vendoring的软件包以及没有最新安装的依赖项的软件包都是阻止vet
使用完整类型信息运行的因素
不再是了现在“go-vet
”命令将传递给vet
有关所有这些内容的完整信息,根据需要构建新的.a
文件(CL 74355和CL 74750)。
现在“go-vet
”在分析软件包时保证具有最新的类型信息,这将提高其分析的准确性。
要做到这一点,最终需要将构建这些.a
文件的成本分摊出去
只有“go vet
”有此保证。不要使用“go-tool-vet
”,这基本上只对从事vet
工作的人员有用(就像您通常不运行“go-tool-compile
”)。
以前,如果您想要控制vet标志,您需要使用“go tool vet
”,但是“go vet
”现在接受“go tool vet
”所做的所有标志。(请参见“go help vet
”)
以下是我使用的:
golint $(ls -d1 */ | sed s/\\//\\/.../g | grep -v -E "^vendor/" | tr "\n" " ")
在Go 1.9中,为/…
引入了一种新的方法,以使供应商
目录()中的包不再匹配,这是一种流行的方法
这意味着在大多数情况下,最简单的方法是现在
go test./…#忽略供应商
快走忽略供应商
去列表。/…#忽略供应商
#等等。
但是,特别是对于gofmt
(如果go-fmt
没有我们需要的选项,我们可能会使用它),情况并没有那么明确:
gofmt
将路径作为参数,而不是包
- 如果给定目录,它会递归工作,因此它看起来就像是
gofmt。
应该可以工作-但这不会忽略供应商
所以要么我们必须回到过去
gofmt-l.|grep-v供应商
但是这将匹配不是实际供应商目录的目录的vendor
,并且在扔掉它之前检查vendor
中的所有内容会觉得浪费
我们也不能使用
gofmt-l$(go list-f'{{.Dir}}./…)
因为/…
与当前目录的包匹配,导致gofmt
到处下降,包括供应商
一个更健壮的解决方案,使用直接迭代文件的模板
gofmt-l$(go list-f'{{range.GoFiles}}{{{$.Dir}}/{{{.}}{{end}}./…)
在具有长路径的大型目录树中可能会遇到命令行长度限制,因此这也不是完美的。我倾向于在可能的情况下使用go fmt./…
。我不确定Philee是什么,而且我自己也没有发现,你可能应该链接到这里和这里的东西,还有这个注释:(对于go vet
)紧跟着这个问题,并参考其他问题。对于go 1.10(2018年第一季度),go-vet不会因而失败,根据供应商软件包的不同,会使用不可见字段
错误。看见