如何列出已安装的 go 包
How to list installed go packages
据我所知 go distribution
带有某种 package manager
。安装 go 1.4.1
后,我 运行 go help
以查找能够列出本地安装的任何子命令 go packages
,但不幸的是 none.
那么怎么做呢?
goinstall
已成为历史
goinstall
被 go get
取代。 go get
用于管理外部/第三方库(例如下载、更新、安装等)。
键入 go help get
以查看命令行帮助,或查看这些页面:
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
会有你所有包裹的清单。
当您安装新的时,它们不会自动出现。您需要重新启动 godoc
.
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)
- 只提取合格的包名(删除版本信息)
- 删除重复的包名
1) 请注意,sed 表达式参数使用 bash quoting 将 TAB 字符转义为“\t”,以提高文字 TAB 的可读性。
据我所知 go distribution
带有某种 package manager
。安装 go 1.4.1
后,我 运行 go help
以查找能够列出本地安装的任何子命令 go packages
,但不幸的是 none.
那么怎么做呢?
goinstall
已成为历史
goinstall
被 go get
取代。 go get
用于管理外部/第三方库(例如下载、更新、安装等)。
键入 go help get
以查看命令行帮助,或查看这些页面:
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
会有你所有包裹的清单。
当您安装新的时,它们不会自动出现。您需要重新启动 godoc
.
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)
- 仅提取
- 只提取合格的包名(删除版本信息)
- 删除重复的包名
1) 请注意,sed 表达式参数使用 bash quoting 将 TAB 字符转义为“\t”,以提高文字 TAB 的可读性。