Golang中如何引用本地开发的内部包文档?
Golang中如何引用本地开发的内部包文档? 我们有一个希望在内部维护并在多个项目中复用的包。我找到的所有相关教程似乎都要求使用公共的第三方 Git 托管网站,但我们的项目并不使用这些网站。
因此,假设开发者机器上已有一份包 A 的副本,有人能为我指明方向,告诉我如何在项目 B 的 import 指令中引用 A 吗?
我们尝试过将包放在 vendor 子目录中,但 import "vendor/A" 会导致错误:“vendor/A must be imported as A”。同时,import "A" 会导致错误:“package A is not in GOROOT”。(这两个错误都是执行 go build 命令的结果。)
我们尝试按照 https://golang.org/doc/code#ImportingLocal 中描述的示例操作,结果是一样的。
先谢谢了。
更多关于Golang中如何引用本地开发的内部包文档?的实战教程也可以访问 https://www.itying.com/category-94-b0.html
根据我的理解,您有一个单独的包存放在开发人员的机器上供他们使用吗?坦率地说,我可能会建议设置一个内部的 Gitlab 仓库。
或者,Go 提供了 GOPRIVATE 环境变量,它可以用来指向非公开可用的代码仓库。因此,您可以将该包上传到一个私有的代码仓库(例如 Github),或者也可以将其指向用户的机器。
更多关于Golang中如何引用本地开发的内部包文档?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你是否在使用 Go 模块?如果是,据我所知,供应商化的模块必须被列为“vendored”。
此外,"A" 不是标准库的已知成员,因此你不能在自己的包中使用它。在较新版本(自 Go 1.13 或 1.14 起)中,包名的第一部分需要包含一个 .。
最后但同样重要的是,你不需要使用公共托管服务,也可以使用自托管的 GitLab。在我的公司,我们就是这样做的,效果很好。
Go 的依赖跟踪深度依赖于所有内容都存储在 Git 或其他版本控制系统中。
在Go中引用本地开发的内部包,可以通过以下几种方式实现:
方法1:使用replace指令(推荐)
在项目B的go.mod文件中添加replace指令:
// 项目B的go.mod
module project-b
go 1.21
replace example.com/internal/a => ../path/to/package-a
require example.com/internal/a v0.0.0
然后在代码中正常导入:
// 项目B中的代码
package main
import "example.com/internal/a"
func main() {
a.SomeFunction()
}
方法2:使用本地路径
在项目B的go.mod中直接引用本地路径:
// 项目B的go.mod
module project-b
go 1.21
require example.com/a v0.0.0
replace example.com/a => ../path/to/package-a
方法3:配置GOPATH
将包A放在GOPATH/src目录下:
# 假设GOPATH是~/go
mkdir -p ~/go/src/example.com/internal
cp -r /path/to/package-a ~/go/src/example.com/internal/a
然后在项目B中导入:
import "example.com/internal/a"
方法4:使用vendor目录(正确方式)
首先,确保包A有自己的go.mod文件:
// 包A的go.mod
module example.com/internal/a
go 1.21
然后在项目B中:
# 进入项目B目录
cd project-b
# 添加依赖
go mod edit -replace example.com/internal/a=../path/to/package-a
go mod tidy
# 如果需要vendor
go mod vendor
导入时使用模块名,而不是vendor路径:
// 正确方式
import "example.com/internal/a"
// 不要使用
// import "vendor/example.com/internal/a"
完整示例
包A的结构:
/path/to/package-a/
├── go.mod # module example.com/internal/a
├── a.go
└── a_test.go
包A的代码:
// a.go
package a
import "fmt"
func Hello() {
fmt.Println("Hello from package A")
}
项目B的结构:
/project-b/
├── go.mod # 包含replace指令
├── main.go
└── vendor/ # 可选
项目B的go.mod:
module project-b
go 1.21
replace example.com/internal/a => ../path/to/package-a
require example.com/internal/a v0.0.0
项目B的main.go:
package main
import "example.com/internal/a"
func main() {
a.Hello()
}
构建和测试
# 在项目B目录中
go build
go run main.go
如果遇到缓存问题,可以清理缓存:
go clean -modcache
这种方式不需要公共Git仓库,完全在本地工作,适合内部包开发和复用。

