【发布时间】:2022-04-23 00:17:46
【问题描述】:
据我所知,go distribution 带有某种 package manager。在go 1.4.1 安装后,我运行go help 以找到任何能够列出本地安装的go packages 的子命令,但不幸的是没有。
那该怎么做呢?
【问题讨论】:
标签: go
据我所知,go distribution 带有某种 package manager。在go 1.4.1 安装后,我运行go help 以找到任何能够列出本地安装的go packages 的子命令,但不幸的是没有。
那该怎么做呢?
【问题讨论】:
标签: go
goinstall 已成为历史goinstall 已替换为 go get。 go get 用于管理外部/第 3 方库(例如下载、更新、安装等)。
输入 go help get 以查看命令行帮助,或查看以下页面:
如果您想列出已安装的软件包,可以使用go list 命令:
要列出工作区中的包,请转到工作区文件夹并运行以下命令:
go list ./...
./ 告诉从当前文件夹开始,... 告诉递归下去。当然,这适用于任何其他文件夹,而不仅仅是您的 go 工作区(但通常这是您感兴趣的)。
执行
go list ...
在任何文件夹中列出所有包,包括标准库的包,首先是您的 go 工作区中的外部库。
如果你还想按每个包查看导入的包,可以试试这个自定义格式:
go list -f "{{.ImportPath}} {{.Imports}}" ./...
-f 使用包template 的语法为列表指定另一种格式。可以通过go help list命令打印其字段可以引用的结构体。
如果你想查看所有的依赖递归(递归导入包的依赖),你可以使用这个自定义格式:
go list -f "{{.ImportPath}} {{.Deps}}" ./...
但通常这是一个很长的列表,您想要的只是每个包的单个导入 ("{{.Imports}}")。
【讨论】:
go list -f "{{.ImportPath}} {{.Imports}}" ./...
go list '...'
【讨论】:
godoc,请使用:go get -u golang.org/x/tools/...
go list ... 非常有用,但对我来说可能存在两个问题:
go.mod 文件中列出的包),我不关心周围的其他包(可能只是为了尝试而安装的包出去)。 go list ... 对此无济于事。所以这里有一些不同的看法。假设所有项目都在~/work下:
find ~/work -type f -name go.mod \
-exec sed $'/^require ($/,/^)$/!d; /^require ($/d;/^)$/d; /\\/\\/ indirect$/d; s/^\t+//g' {} \; \
| cut -d' ' -f1 \
| sort | uniq
逐行解释:
go.mod 文件sed以过滤其内容如下(逐个表达式解释):
require( ... ) 块require( 和 ) 行,因此只保留包含包的行1) 请注意,sed 表达式参数使用 bash quoting 将 TAB 字符转义为“\t”,以便在文字 TAB 上阅读。
【讨论】:
sed: 1: "/^require ($/,/^)$/!d; ...": invalid command code /
在 *nix 系统上(可能在带有诸如 msysgit 或 cmder 之类的 bash 工具的 Windows 上),查看我安装了哪些软件包,我可以运行:
history | grep "go get"
但那是混乱的输出。无论出于何种原因,我决定看到我可以稍微清理一下该输出,所以我为这个命令创建了一个别名:
history | grep 'go get' | grep -v ' history ' | sed -e $'s/go get /\\\\\ngo get /g' | grep 'go get ' | sed -e $'s/-u //g' | sed -e $'s/-v //g' | sed -e $'s/ &&//g' | grep -v '\\\n' | egrep 'get [a-z]' | sed -e $'s/go get //g' | sed -e $'s/ //g' | sort -u
请不要问我为什么这样做。也许挑战?让我解释一下这些部分
history历史
grep "go get" grep 遍历历史,只显示我们去的地方并得到了一些东西
grep -v " history " 并删除我们在历史记录中搜索“get get”的时间
sed -e $'s/go get /\\\\\ngo get /g' 现在我们采用任何“go get”实例并在它前面插入一个新行。现在他们都在开始。
grep "go get " 只过滤现在以“go get”开头的行
sed -e $'s/-u //g' 和 sed -e $'s/-v //g' 删除我们搜索过的标志。您可以保留它们,但在输出完成后可能会出现重复。
sed -e $'s/ &&//g' 有时我们使用 '&&' 安装多个命令,所以让我们从行尾删除它们。
grep -v "\\\n" 我的输出中还有其他行打印了我不需要的换行符。所以这摆脱了他们
egrep "get [a-z]" 确保仅获取格式正确的 go 包 url。
sed -e $'s/go get //g'删除“去获取”文本
sed -e $'s/ //g' 去除所有空格(需要过滤掉重复项)
sort -u 现在对剩余的行进行排序并删除重复项。
这在其他系统上完全未经测试。同样,我很确定有一种更清洁的方法可以做到这一点。只是觉得尝试一下会很有趣。
创建一个go ls 命令来显示您明确安装的实际包也可能会更有趣。但这还有很多工作要做。特别是因为我才还在学习围棋。
输出:
> gols
code.google.com/p/go.crypto/bcrypt
github.com/golang/lint/golint
github.com/kishorevaishnav/revelgen
github.com/lukehoban/go-find-references
github.com/lukehoban/go-outline
github.com/newhook/go-symbols
github.com/nsf/gocode
github.com/revel/cmd/revel
github.com/revel/revel
github.com/rogpeppe/godef
github.com/tpng/gopkgs
golang.org/x/tools/cmd/goimports
golang.org/x/tools/cmd/gorename
gopkg.in/gorp.v1
sourcegraph.com/sqs/goreturns
【讨论】: