Golang中如何配合Go Module使用pkg包

Golang中如何配合Go Module使用pkg包 由于我能够在多个项目中分别管理每个pkg目录,因此我非常喜欢配合vscode-go使用GOPATH。
但现在看来,使用模块化方式似乎无法实现这一点。

我想了解大家是如何管理依赖项的。
是像我一样管理,还是直接将其混合放在GOPATH下的单个pkg目录中?

10 回复

一个源码,一个二进制文件,这似乎是最佳答案之一。

我在一些项目中以单一模块的方式工作。也许我并没有错。

更多关于Golang中如何配合Go Module使用pkg包的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


到目前为止,我已经成功将共同开发的内容整合到单个模块中。这似乎是目前最简单的方法,可以避免使用替换指令等复杂操作。

就我个人而言,我正在开发微服务。虽然会有多个二进制文件,但这并不意味着没有共享代码(消息契约/工具方法等)。所有这些服务也会一起进行版本管理。

虽然我不是GoLand的用户…

GO111MODULE的默认值是auto,因此如果你的项目路径不在GOPATH下,就不需要设置GO111MODULE环境变量。

我认为你可以将模块视为一个类似GOPATH的独立宇宙,确实如此。对我来说,让模块与代码仓库保持一致,并将某些仓库设置为类似单体仓库的形式运作良好。

我在想是不是GoLand的问题,它确实支持vgo,但我怀疑它可能没有按要求设置GO111MODULE。

稍后会尝试2018.3 EAP版本 🙂

我认为问题在于它不接受模块父文件夹以上的任何路径,所以我需要在根目录进行初始化。稍后会尝试这个方法。但这本质上又回到了GOPATH的模式!

表情

我本来想问一个类似的问题。我有一个GOPATH,包含9个可执行文件和4个文件夹,这些可执行文件之间共享代码,每个都有外部依赖。所以我非常喜欢新的依赖管理理念!但在添加后它根本无法编译,我不得不回退到旧的方式。(我也将我的文件夹视为单体仓库)

所以我也非常想了解如何处理这些问题。我阅读了文档,一切看起来都很有道理,但在实践中却行不通。

我不确定下面尝试的方法是否可行,但我正在尝试这种方式以及其他一些方法。

我尝试在 go mod tidy 之后使用 go mod vendor,然后执行 go build -mod vendor。 在实际操作中(这个这个)一切都很顺利,除了每次初始工作时需要手动修改每个包中的 go.mod 文件。

无论如何,除了磁盘空间不足的情况外,我不再接触 gopath 了。

在 Go 1.12 发布之前,我可能会继续使用这种方式。 同时,希望会有更好的方法出现。

在Go Module模式下,管理依赖项的方式与传统的GOPATH有所不同,但更加灵活和规范。以下是具体的使用方法和示例:

1. 初始化Go Module项目

在项目根目录执行:

go mod init <module-name>

例如:

go mod init github.com/username/myproject

2. 依赖管理

  • 添加依赖:直接导入包后运行 go mod tidy,或使用:
    go get github.com/example/dependency@v1.2.3
    
  • 查看依赖:使用 go list -m all 或检查 go.mod 文件。

3. 本地包引用

若需引用本地包(如 pkg 目录),在 go.mod 中使用 replace 指令:

module github.com/username/myproject

go 1.21

require (
    github.com/example/dependency v1.2.3
)

replace github.com/username/myproject/pkg/mylib => ./pkg/mylib

在代码中直接导入:

import "github.com/username/myproject/pkg/mylib"

func main() {
    mylib.SomeFunction()
}

4. 依赖缓存

Go Module将依赖缓存于 $GOPATH/pkg/mod,但无需手动管理。清理缓存使用:

go clean -modcache

示例项目结构

myproject/
├── go.mod
├── go.sum
├── main.go
└── pkg/
    └── mylib/
        ├── mylib.go
        └── mylib_test.go

mylib.go:

package mylib

import "fmt"

func SomeFunction() {
    fmt.Println("来自本地pkg包的函数")
}

main.go:

package main

import "github.com/username/myproject/pkg/mylib"

func main() {
    mylib.SomeFunction()
}

5. 工作区模式(Go 1.18+)

对于多模块项目,使用工作区:

go work init
go work use ./pkg/mylib

创建 go.work 文件:

go 1.21

use (
    .
    ./pkg/mylib
)

Go Module通过版本控制和明确的依赖声明,避免了GOPATH的全局依赖混合问题。使用 go mod tidy 自动维护依赖,vendor 目录(可选)用于固化依赖版本:

go mod vendor

这种方式确保了依赖隔离和版本一致性,适合团队协作和CI/CD流程。

回到顶部