Golang中如何引用本地开发的内部包文档?

Golang中如何引用本地开发的内部包文档? 我们有一个希望在内部维护并在多个项目中复用的包。我找到的所有相关教程似乎都要求使用公共的第三方 Git 托管网站,但我们的项目并不使用这些网站。

因此,假设开发者机器上已有一份包 A 的副本,有人能为我指明方向,告诉我如何在项目 Bimport 指令中引用 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

3 回复

根据我的理解,您有一个单独的包存放在开发人员的机器上供他们使用吗?坦率地说,我可能会建议设置一个内部的 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仓库,完全在本地工作,适合内部包开发和复用。

回到顶部