Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 如何使过梁忽略供应商/?_Go - Fatal编程技术网

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不会因
而失败,根据供应商软件包的不同,会使用不可见字段
错误。看见