如何列出已安装的go包

时间:2015-01-27 08:40:56

标签: go

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

那怎么办呢?

4 个答案:

答案 0 :(得分:50)

goinstall现在是历史

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

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

Command go

About the go command(博文)

如果要列出已安装的软件包,可以使用go list命令执行此操作:

列出包

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

go list ./...

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

列出所有包

执行

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?

答案 1 :(得分:7)

启动Go文档服务器:

proc

访问http://localhost:6060/pkg

将列出所有包裹。

如果您要安装新的,它们将不会自动显示。你需要重启“godoc”。

答案 2 :(得分:2)

在* 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 over history,只显示我们去过的地方并获得了一些东西

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]"请确保正确格式化包裹网址。

sed -e $'s/go get //g'删除“go get”文字

sed -e $'s/ //g'删除任何空格(需要过滤重复项)

sort -u现在对剩余的行进行排序并删除重复项。

这在其他系统上完全未经测试。同样,我很确定有更清洁的方法来做到这一点。只是觉得尝试会很有趣。

使用go ls命令显示您明确安装的实际软件包可能会更有趣。但那还有很多工作要做。特别是因为我还在学习Go。

输出:

> 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

答案 3 :(得分:0)

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上易于阅读。