如何列出已安装的 go 包

How to list installed go packages

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

那么怎么做呢?

goinstall 已成为历史

goinstallgo get 取代。 go get 用于管理外部/第三方库(例如下载、更新、安装等)。

键入 go help get 以查看命令行帮助,或查看这些页面:

Command go

About the go command(博客post)

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

列出包

要列出工作区中的包,请转至工作区文件夹并运行执行此命令:

go list ./...

./ 表示从当前文件夹开始,... 表示递归向下。当然,这不仅适用于您的 go 工作区中的任何其他文件夹(但通常这就是您感兴趣的内容)。

列出所有包

正在执行

go list ...

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

包及其依赖项

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

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

-f 指定列表的替代格式,使用包 template 的语法。 go help list命令可以打印出可以引用字段的struct。

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

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

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


另见相关问题:

在 *nix 系统上(可能在 windows 上使用 bash 工具,如 msysgit 或 cmder),要查看我安装了哪些包,我可以 运行:

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 over history 并且只显示我们去的地方和得到的东西的行

grep -v " history " 并删除我们在历史记录中搜索 "got 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' 删除 "go get " 文本

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

启动 Go 文档服务器:

godoc --http :6060

访问http://localhost:6060/pkg

会有你所有包裹的清单。

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

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 的可读性。