Golang中替换同模块包的分支实现方法

Golang中替换同模块包的分支实现方法 我正在尝试执行一个我从GitHub上fork到我的GitHub账户的Go项目。我将 https://github.com/rfjakob/gocryptfs fork 到了 https://github.com/DerDonut/gocryptfs。我下载了代码并创建了一个新的 go.mod 文件:

module github.com/DerDonut/gocryptfs
go 1.14
require (
    github.com/hanwen/go-fuse v1.0.1-0.20190319092520-161a16484456
    github.com/jacobsa/crypto v0.0.0-20190317225127-9f44e2d11115
    github.com/jacobsa/oglematchers v0.0.0-20150720000706-141901ea67cd // indirect
    github.com/jacobsa/oglemock v0.0.0-20150831005832-e94d794d06ff // indirect
    github.com/jacobsa/ogletest v0.0.0-20170503003838-80d50a735a11 // indirect
    github.com/jacobsa/reqtrace v0.0.0-20150505043853-245c9e0234cb // indirect
    github.com/pkg/xattr v0.4.1
    github.com/rfjakob/eme v1.1.1
    github.com/rfjakob/gocryptfs v0.0.0-00010101000000-000000000000
    github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94
    github.com/stretchr/testify v1.5.1 // indirect
    golang.org/x/crypto v0.0.0-20200429183012-4b2356b1ed79
    golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a
    golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3
)
replace github.com/rfjakob/gocryptfs => /home/donut/work/compile/go/src/github.com/DerDonut/gocryptfs

在调试或运行代码时,输出充满了类似这样的错误: main.go:14:2: use of internal package github.com/rfjakob/gocryptfs/internal/* not allowed

其中 * 代表 /internal 目录下的不同文件。所以我知道从其他模块导入内部文件是被故意禁止的。因此,我在上面的 go.mod 中使用了 replace 指令。但它似乎不起作用。我想我在这里遗漏了一些概念,因为每次我 fork 一个项目时都会出现这个问题,并且会适用于来自同一模块的所有导入。所以我的问题是:如何将所有来自同一模块的导入重定向到我的本地项目文件夹? 我正在使用 Visual Studio Code 1.45.0。这是我的 go env 输出:

GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/donut/.cache/go-build"
GOENV="/home/donut/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/home/donut/work/compile/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/lib/go-1.14"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/lib/go-1.14/pkg/tool/linux_amd64"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build591927719=/tmp/go-build -gno-record-gcc-switches"

更多关于Golang中替换同模块包的分支实现方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

经过数小时的反复尝试,我终于解决了这个问题。

最初我是通过 go get 下载的代码。我删除了本地的整个仓库,然后通过 git clone 重新下载了一遍。现在,一切似乎都正常工作了。我不清楚第一种方式问题出在哪里。

更多关于Golang中替换同模块包的分支实现方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go模块中替换同模块包的正确方法是使用replace指令指向你的fork版本,但需要确保模块路径完全匹配。根据你的错误信息,问题在于internal包的访问限制。以下是解决方案:

// go.mod
module github.com/DerDonut/gocryptfs

go 1.14

require (
    github.com/hanwen/go-fuse v1.0.1-0.20190319092520-161a16484456
    github.com/jacobsa/crypto v0.0.0-20190317225127-9f44e2d11115
    github.com/jacobsa/oglematchers v0.0.0-20150720000706-141901ea67cd // indirect
    github.com/jacobsa/oglemock v0.0.0-20150831005832-e94d794d06ff // indirect
    github.com/jacobsa/ogletest v0.0.0-20170503003838-80d50a735a11 // indirect
    github.com/jacobsa/reqtrace v0.0.0-20150505043853-245c9e0234cb // indirect
    github.com/pkg/xattr v0.4.1
    github.com/rfjakob/eme v1.1.1
    github.com/rfjakob/gocryptfs v0.0.0-00010101000000-000000000000
    github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94
    github.com/stretchr/testify v1.5.1 // indirect
    golang.org/x/crypto v0.0.0-20200429183012-4b2356b1ed79
    golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a
    golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3
)

replace github.com/rfjakob/gocryptfs => ./../DerDonut/gocryptfs

或者使用绝对路径:

replace github.com/rfjakob/gocryptfs => /home/donut/work/compile/go/src/github.com/DerDonut/gocryptfs

但更推荐的方法是直接修改模块名为你的fork路径,然后更新所有导入:

// go.mod
module github.com/DerDonut/gocryptfs

go 1.14

require (
    github.com/hanwen/go-fuse v1.0.1-0.20190319092520-161a16484456
    github.com/jacobsa/crypto v0.0.0-20190317225127-9f44e2d11115
    github.com/jacobsa/oglematchers v0.0.0-20150720000706-141901ea67cd // indirect
    github.com/jacobsa/oglemock v0.0.0-20150831005832-e94d794d06ff // indirect
    github.com/jacobsa/ogletest v0.0.0-20170503003838-80d50a735a11 // indirect
    github.com/jacobsa/reqtrace v0.0.0-20150505043853-245c9e0234cb // indirect
    github.com/pkg/xattr v0.4.1
    github.com/rfjakob/eme v1.1.1
    github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94
    golang.org/x/crypto v0.0.0-20200429183012-4b2356b1ed79
    golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a
    golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3
)

然后运行以下命令更新所有导入:

go mod tidy

如果项目中还有其他文件引用了原模块路径,需要手动更新这些导入语句。例如:

// 原代码
import "github.com/rfjakob/gocryptfs/internal/foo"

// 修改为
import "github.com/DerDonut/gocryptfs/internal/foo"

对于Visual Studio Code,确保启用Go模块支持:

// settings.json
{
    "go.useLanguageServer": true,
    "go.toolsEnvVars": {
        "GO111MODULE": "on"
    }
}

最后清理并重新构建:

go clean -modcache
go mod download
go build ./...
回到顶部