删除使用go get安装的包

我运行go get package来下载一个包,然后才知道我需要设置我的GOPATH,否则这个包会玷污我的根Go安装(我更喜欢保持我的Go安装干净,并将核心与自定义分离)。如何删除以前安装的包?

301412 次浏览

只删除源目录和编译包文件是安全的。在$GOPATH/src下找到源目录,在$GOPATH/pkg/<architecture>下找到包文件,例如:$GOPATH/pkg/windows_amd64

你可以删除go install(或go get)为带有go clean -i importpath...的包生成的存档文件和可执行二进制文件。它们通常分别位于$GOPATH/pkg$GOPATH/bin下。

确保在importpath中包含...,因为看起来,如果一个包包含可执行文件,go clean -i只会删除它,而不会为子包归档文件,就像下面例子中的gore/gocode

然后需要手动从$GOPATH/src中删除源代码。

go clean有一个用于预演的-n标志,该标志打印出在不执行的情况下将要运行的内容,因此可以确定(参见go help clean)。它还有一个诱人的-r标志来递归地清除依赖项,你可能不想实际使用它,因为你将从一个试运行中看到它将删除大量标准库存档文件!

一个完整的例子,如果你喜欢,你可以在上面创建一个脚本:

$ go get -u github.com/motemen/gore


$ which gore
/Users/ches/src/go/bin/gore


$ go clean -i -n github.com/motemen/gore...
cd /Users/ches/src/go/src/github.com/motemen/gore
rm -f gore gore.exe gore.test gore.test.exe commands commands.exe commands_test commands_test.exe complete complete.exe complete_test complete_test.exe debug debug.exe helpers_test helpers_test.exe liner liner.exe log log.exe main main.exe node node.exe node_test node_test.exe quickfix quickfix.exe session_test session_test.exe terminal_unix terminal_unix.exe terminal_windows terminal_windows.exe utils utils.exe
rm -f /Users/ches/src/go/bin/gore
cd /Users/ches/src/go/src/github.com/motemen/gore/gocode
rm -f gocode.test gocode.test.exe
rm -f /Users/ches/src/go/pkg/darwin_amd64/github.com/motemen/gore/gocode.a


$ go clean -i github.com/motemen/gore...


$ which gore


$ tree $GOPATH/pkg/darwin_amd64/github.com/motemen/gore
/Users/ches/src/go/pkg/darwin_amd64/github.com/motemen/gore


0 directories, 0 files


# If that empty directory really bugs you...
$ rmdir $GOPATH/pkg/darwin_amd64/github.com/motemen/gore


$ rm -rf $GOPATH/src/github.com/motemen/gore

注意,这个信息是基于Go版本1.5.1中的go工具。

#!/bin/bash


goclean() {
local pkg=$1; shift || return 1
local ost
local cnt
local scr


# Clean removes object files from package source directories (ignore error)
go clean -i $pkg &>/dev/null


# Set local variables
[[ "$(uname -m)" == "x86_64" ]] \
&& ost="$(uname)";ost="${ost,,}_amd64" \
&& cnt="${pkg//[^\/]}"


# Delete the source directory and compiled package directory(ies)
if (("${#cnt}" == "2")); then
rm -rf "${GOPATH%%:*}/src/${pkg%/*}"
rm -rf "${GOPATH%%:*}/pkg/${ost}/${pkg%/*}"
elif (("${#cnt}" > "2")); then
rm -rf "${GOPATH%%:*}/src/${pkg%/*/*}"
rm -rf "${GOPATH%%:*}/pkg/${ost}/${pkg%/*/*}"
fi


# Reload the current shell
source ~/.bashrc
}

用法:

# Either launch a new terminal and copy `goclean` into the current shell process,
# or create a shell script and add it to the PATH to enable command invocation with bash.


goclean github.com/your-username/your-repository

你可以使用go mod tidy来清理未使用的包

伙计,我昨天也遇到了同样的问题。在$GOPATH/pkg/<architecture>中找不到任何东西。然后,我意识到在我的$HOME中有一个go目录。所以,我移动到$HOME/<username>/go/pkg/mod/github.com,看到我从github通过go get安装的所有包

go包可以按如下方式移除。

go get package@none

这里@none是设置为none的版本部分。这样就去掉了包装。

删除对某个模块的依赖,并降级需要它的模块:

go get example.com/mod@none

来源:运行go help get