我需要检查是否安装了某些软件包,但是我需要使用代码,而不是shell中的go list
工具。我找到了一个解决方案,但它很慢(2-3秒)。这是我目前的代码:
out, err := exec.Command("sh", "-c", "go list all").Output()
if err != nil {
output := strings.Split(string(out), "\n")
for _, value := range output {
if value == "github.com/some/package" {
// package is installed
}
}
}
答案 0 :(得分:2)
所以基本上你回答了自己的问题。您想要更快的解决方案吗?尝试“调整”go list
命令。
要检查是否存在单个包,您可以将该单个包传递给go list
,如果存在,则将其输出,否则输出将是错误消息。
例如,执行
go list github.com/some/package
如果github.com/some/package
存在,则输出为:
github.com/some/package
您还可以将多个包传递给go list
:
go list github.com/some/package github.com/other/package
输出将是:
github.com/some/package
github.com/other/package
如果传递的包不存在,输出将类似于:
can't load package: package github.com/some/package: cannot find package "github.com/some/package" in any of:
/usr/local/go/src/github.com/some/package (from $GOROOT)
<GOPATH-here>/src/github.com/some/package (from $GOPATH)
另请注意,如果您传递的包不包含*.go
个文件,则会收到不同的消息:
can't load package: package github.com/some/package: no buildable Go source files in <GOPATH-here>/src/github.com/some/package
如果您希望其中有一些包,请附加...
:
go list github.com/some/package/...
要获得更多选项和可能性,请运行go help list
,然后查看相关问题:How to list installed go packages