Golang开发中如何仅在本地环境下导入包

Golang开发中如何仅在本地环境下导入包 你好,

这是一个关于在开发过程中处理依赖项的问题。

示例:

src/github.com/thisdougb/worker/
src/github.com/thisdougb/data/

在模块 ‘worker’ 中,我导入了 ‘data’。我使用了 ‘go get -u github.com/thisdougb/data/’,因此 data 在 worker/go.mod 中被引用并带有版本号。

Go 语言中有什么方法可以避免提交/推送/go get 这样的往返操作,而是在开发期间通过本地文件系统引用 ‘data’ 呢?这样,当我保存更改(提交前)时,我的 ‘worker’ 模块就能获取到这些更改。

谢谢,


更多关于Golang开发中如何仅在本地环境下导入包的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

太好了,谢谢。

是的,我可以在CI流水线中移除替换语句。如果我使用单独的语句,我可以在部署/测试期间通过grep命令将它们过滤掉。

require github.com/thisdougb/data v1.1.1
replace github.com/thisdougb/data => ../data // not-prod

干杯,

更多关于Golang开发中如何仅在本地环境下导入包的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


太好了,谢谢。

是的,我可以在CI流水线中移除replace语句。如果我使用单独的语句,我可以在部署/测试期间用grep将它们过滤掉。

很高兴听到这个消息 =)

请将相应的帖子标记为“已解决”,以便将来搜索参考,并避免论坛中的其他帮助者重复劳动。

DougB: 在开发过程中,如何避免提交/推送/go get的往返过程,而是通过本地文件系统引用’data’?

你可以在 worker/go.mod 中使用 replace 子句来定义本地导入路径。例如:

replace (
     github.com/thisdougb/data => ./tmp/local/data
)

但是,你需要确保本地的“data”路径可供导入,并且其中必须包含一个 go.mod 文件。然后,你需要将 github.com/thisdougb/data 克隆到相对路径 ./tmp/local/data 中。

本地导入路径也可以接受绝对路径。

通常,在提交发布版本之前,我会移除这个子句。如果你决定保留它,你必须确保分发版本能够在指定路径中获取其自身的“data”包。

在Go模块开发中,可以通过replace指令在go.mod文件中实现本地包引用。这种方法允许你在开发期间直接引用本地文件系统的包,而无需提交到远程仓库。

解决方案

worker/go.mod文件中添加replace指令:

module github.com/thisdougb/worker

go 1.21

require (
    github.com/thisdougb/data v0.0.0
)

replace github.com/thisdougb/data => ../data

详细说明

  1. 修改worker/go.mod文件
module github.com/thisdougb/worker

go 1.21

require (
    github.com/thisdougb/data v0.0.0
)

// 将远程引用替换为本地路径
replace github.com/thisdougb/data => ../data

// 其他依赖...
  1. 目录结构保持不变
your-project/
├── worker/
│   ├── go.mod
│   ├── go.sum
│   └── main.go
└── data/
    ├── go.mod
    └── data.go
  1. 在worker中正常导入data包
package main

import (
    "fmt"
    "github.com/thisdougb/data"
)

func main() {
    result := data.Process("test")
    fmt.Println(result)
}
  1. 运行和构建
# 在worker目录下
cd worker
go run main.go
go build

注意事项

  • replace指令只在本地开发环境中生效,不会影响其他协作者
  • 提交代码时,通常不提交包含replace指令的go.mod文件
  • 可以使用环境变量或构建标签来管理不同环境的配置

替代方案:使用相对路径的require

如果你的Go版本支持(1.18+),也可以直接使用相对路径:

module github.com/thisdougb/worker

go 1.21

require github.com/thisdougb/data v0.0.0

replace github.com/thisdougb/data => ../data

这种方法让你在开发时直接引用本地包,保存更改后立即生效,无需执行go get操作。

回到顶部