Golang如何将本地包导入到另一个项目中

Golang如何将本地包导入到另一个项目中 我已将 GOPATH 设置为 /home/oem/golib:/home/oem/code,这两个目录都包含 srcpkgbin 子目录。我的工作目录是 home/oem/code/,我在其中模拟了一个位于 src/firstpkg 的包和一个位于 src/project 的项目(main.go 文件在此处),两者都使用 go mod init xyz 初始化。尽管阅读了许多帖子,我仍然无法解决如何将本地包 firstpkg 导入到项目中的问题,而这两个包都在 GOPATH 中。请查看包含 “go env” 的截图,似乎尽管设置了 GOPATH,但 Go 语言并未在其中查找。非常感谢任何帮助!

image


更多关于Golang如何将本地包导入到另一个项目中的实战教程也可以访问 https://www.itying.com/category-94-b0.html

7 回复

我一直以为 GO111MODULE=auto 就能解决问题。

更多关于Golang如何将本地包导入到另一个项目中的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我也试过那个方法,但对我没用。谢谢。

replace 指令配合本地路径仅用于开发环境,切勿以这种方式提交代码,而应在本地将其指向正确的位置。

Go 模块完全不查看 GOPATH。请通过其模块名称引用另一个模块,并使用 replace 指令使其指向本地路径。

图片

Go Modules 参考 - Go 编程语言

我想补充一点,Go 1.18 中的 Go 工作区功能以更简单、更好的方式解决了这个问题。以下两个参考资料非常有帮助:

工作区也旨在取代 replace directives,使事情变得更加简单。

非常感谢。我已经测试过了,它可以正常工作。

我还有一个相关的小问题,我认为放在这里问也很合适。如何在 go.mod 中使用绝对路径,以便适应不同的用户/计算机?例如,我想引用包 /home/myLaptop/SyncingFolder/package,但如果我在我的台式机上使用,路径就变成了 /home/myDesktop/SyncingFolder/package,这会产生冲突。我们无法在 go.mod 中使用 import 指令来调用 os.Getenv("HOME"),使用家目录符号 ~/ 也不行。虽然可以使用像 ../../../../somepkg 这样的相对路径,但对于新包指向的位置来说,这种解决方案非常不清晰。对此有什么想法吗?

我期望的示例是:replace somepackage => ~/SyncingFolder/someotherpkg

根据你的描述和截图,问题在于你同时使用了GOPATH和Go Modules,这导致了冲突。Go Modules启用后(GO111MODULE=on或auto且在模块目录中),Go会忽略GOPATH的包查找机制。以下是解决方案:

方案1:完全使用Go Modules(推荐) 将本地包作为模块依赖导入:

  1. firstpkg目录中初始化模块并创建版本标签:
cd /home/oem/code/src/firstpkg
go mod init example.com/firstpkg
  1. project的go.mod中添加replace指令指向本地路径:
cd /home/oem/code/src/project
go mod init example.com/project

编辑go.mod文件:

module example.com/project

go 1.21

require example.com/firstpkg v0.0.0

replace example.com/firstpkg => ../firstpkg
  1. 在project中正常导入:
package main

import (
    "fmt"
    "example.com/firstpkg"
)

func main() {
    fmt.Println(firstpkg.SomeFunction())
}

方案2:禁用Go Modules,使用GOPATH模式 如果你需要保持GOPATH工作流:

  1. 设置环境变量禁用模块:
export GO111MODULE=off
  1. 确保包结构符合GOPATH约定:
/home/oem/code/src/
├── firstpkg/
│   └── firstpkg.go
└── project/
    └── main.go
  1. 在project中导入:
package main

import (
    "fmt"
    "firstpkg"
)

func main() {
    fmt.Println(firstpkg.SomeFunction())
}

方案3:使用vendor目录(过渡方案)

cd /home/oem/code/src/project
go mod vendor
go build -mod=vendor

根据你的截图显示GO111MODULE=on,这意味着Go强制使用模块模式。我建议采用方案1,这是现代Go项目的标准做法。如果仍有问题,请检查firstpkg目录是否包含有效的go.mod文件,并且导出的函数首字母大写。

回到顶部