【问题标题】:How to list installed go packages如何列出已安装的 go 包
【发布时间】:2022-04-23 00:17:46
【问题描述】:

据我所知,go distribution 带有某种 package manager。在go 1.4.1 安装后,我运行go help 以找到任何能够列出本地安装的go packages 的子命令,但不幸的是没有。

那该怎么做呢?

【问题讨论】:

标签: go


【解决方案1】:

goinstall 已成为历史

goinstall 已替换为 go getgo get 用于管理外部/第 3 方库(例如下载、更新、安装等)。

输入 go help get 以查看命令行帮助,或查看以下页面:

Command go

About the go command(博文)

如果您想列出已安装的软件包,可以使用go list 命令:

列出包

要列出工作区中的包,请转到工作区文件夹并运行以下命令:

go list ./...

./ 告诉从当前文件夹开始,... 告诉递归下去。当然,这适用于任何其他文件夹,而不仅仅是您的 go 工作区(但通常这是您感兴趣的)。

列出所有包

执行

go list ...

在任何文件夹中列出所有包,包括标准库的包,首先是您的 go 工作区中的外部库。

包及其依赖项

如果你还想按每个包查看导入的包,可以试试这个自定义格式:

go list -f "{{.ImportPath}} {{.Imports}}" ./...

-f 使用包template 的语法为列表指定另一种格式。可以通过go help list命令打印其字段可以引用的结构体。

如果你想查看所有的依赖递归(递归导入包的依赖),你可以使用这个自定义格式:

go list -f "{{.ImportPath}} {{.Deps}}" ./...

但通常这是一个很长的列表,您想要的只是每个包的单个导入 ("{{.Imports}}")。


另见相关问题:What's the Go (mod) equivalent of npm-outdated?

【讨论】:

  • 我们也可以列出包依赖关系吗?
  • 是的,你也可以这样做。尝试运行此命令:go list -f "{{.ImportPath}} {{.Imports}}" ./...
  • 根据您的外壳,您可能需要引用三个点。 go list '...'
【解决方案2】:

启动 Go 文档服务器:

godoc --http :6060

访问http://localhost:6060/pkg

将列出您所有的包裹。

当您安装新的时,它们不会自动出现。需要重启godoc

【讨论】:

  • 如果您没有安装godoc,请使用:go get -u golang.org/x/tools/...
【解决方案3】:

go list ... 非常有用,但对我来说可能存在两个问题:

  1. 它将列出所有包括标准库包。没有办法只获得显式安装的包(这是我认为更有趣的查询)。
  2. 很多时候我只需要在我的项目中使用的包(即在各自的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

逐行解释:

  1. 查找所有go.mod 文件
  2. 对每个文件应用sed以过滤其内容如下(逐个表达式解释):
    • 只提取 require( ... )
    • 删除 require() 行,因此只保留包含包的行
    • 删除所有间接包
    • 删除前导标签1)
  3. 只提取合格的包名(删除版本信息)
  4. 删除重复的包名

1) 请注意,sed 表达式参数使用 bash quoting 将 TAB 字符转义为“\t”,以便在文字 TAB 上阅读。

【讨论】:

  • 获得大量sed: 1: "/^require ($/,/^)$/!d; ...": invalid command code /
  • @star 是由于命令行中错误的 sed 正则表达式转义。固定(我认为)。
【解决方案4】:

在 *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

【讨论】:

  • 在 bash 中,历史命令限制为 X 行,其中 X 通过 HISTSIZE 和 HISTFILESIZE 配置选项进行配置。因此,上述解决方案不太可能可靠。
  • 是的,这很好。但我认为我的创作会有一些问题;-)
猜你喜欢
  • 2019-12-02
  • 2014-04-17
  • 2013-06-15
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多