Golang中如何为所有项目使用包含多个自定义包的文件夹

Golang中如何为所有项目使用包含多个自定义包的文件夹 我有很多项目,每个项目都做不同的事情,其中大多数都使用了我之前已经创建好的包。

例如,在 custom 目录下,我有这三个包: C:\custom\package_name_a C:\custom\package_name_b C:\custom\package_name_c

我希望在我所有的项目中使用 custom,就像这样:

import(
	"custom/package_name_a"
	"custom/package_name_b"
	"custom/package_name_c"
)

我通过将 custom 文件夹复制到以下目录解决了这个问题: C:\Program Files\Go\src

这样我就可以像之前展示的例子那样导入了。但我的问题在于,当使用 go mod vendor 命令时,它会将我项目的所有依赖项复制到一个名为 vendor 的文件夹中,但完全忽略了我的 custom 依赖项。

那么,我该怎么做才能让 Go 将我的依赖项识别为 vendor 仓库呢?

欢迎提出任何想法,但我必须澄清,custom 不能上传到互联网。


更多关于Golang中如何为所有项目使用包含多个自定义包的文件夹的实战教程也可以访问 https://www.itying.com/category-94-b0.html

7 回复

使用起来并不舒适。

更多关于Golang中如何为所有项目使用包含多个自定义包的文件夹的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


那么你需要将你的模块推送到 GitHub 或任何其他兼容的服务上。

Willy:

Go 向服务器请求包的那种服务叫什么?

goproxy

那种让Go从服务器请求包的服务叫什么?我想看看能否创建一个本地版本。

或者,你能帮我找一个关于这个的教程链接吗?因为我找到的结果都没什么帮助。

关键是在你的 go mod 文件中使用 replace 指令来指向你的本地模块。你需要为你的本地包创建一个 go.mod 文件,使它们成为模块。这里有一个描述:https://levelup.gitconnected.com/import-and-use-local-packages-in-your-go-application-885c35e5624

Willy: 这样我就可以像之前展示的例子中那样导入了。我的问题出现在使用 go mod vendor 命令时,它会将我项目的所有依赖复制到一个名为 vendor 的文件夹中,但完全忽略了我的 custom 依赖。

我非常确定这是因为你把 custom 文件夹放到了 C:\Program Files\Go\src 里,所以编译器认为 custom 是标准库中的一个包,不应该放入 vendor

据我所知,使用一个不在线的不同包的唯一方法,就是像 mje 说的那样,在 go.mod 文件中使用 replace 指令。基本上是这样的结构:

my-go-src-directory/
    custom/
    ...
    my-other-project/
        go.mod

my-go-src-directory/my-other-project/go.mod 文件(以及所有其他使用 custom 的项目)中,我这样写:

module my-other-project

go 1.18

require (
	github.com/skillian/custom v0.0.0-00010101000000-000000000000
)

replace (
	http://github.com/skillian/custom => ../custom
)

即使 custom 从未上传到 github.com,这种方法也有效。

在Go模块系统中,处理本地私有包的正确方式是使用replace指令。以下是具体实现方案:

首先,在custom目录中为每个包初始化模块:

cd C:\custom\package_name_a
go mod init custom/package_name_a

cd C:\custom\package_name_b
go mod init custom/package_name_b

cd C:\custom\package_name_c
go mod init custom/package_name_c

然后在你的项目go.mod文件中添加replace指令:

module your_project

go 1.21

require (
    custom/package_name_a v0.0.0
    custom/package_name_b v0.0.0
    custom/package_name_c v0.0.0
)

replace (
    custom/package_name_a => C:/custom/package_name_a
    custom/package_name_b => C:/custom/package_name_b
    custom/package_name_c => C:/custom/package_name_c
)

或者使用通配符方式(Go 1.18+):

module your_project

go 1.21

require (
    custom/package_name_a v0.0.0
    custom/package_name_b v0.0.0
    custom/package_name_c v0.0.0
)

replace custom/package_name_ => C:/custom/package_name_

执行go mod tidy下载依赖:

go mod tidy

使用go mod vendor时,本地包会被正确复制到vendor目录:

go mod vendor

验证vendor目录结构:

vendor/
├── custom/
│   ├── package_name_a/
│   ├── package_name_b/
│   └── package_name_c/

在代码中正常导入:

package main

import (
    "custom/package_name_a"
    "custom/package_name_b"
    "custom/package_name_c"
)

func main() {
    package_name_a.SomeFunction()
    package_name_b.AnotherFunction()
    package_name_c.ThirdFunction()
}

对于团队协作,可以在项目文档中说明本地依赖的配置方式。每个开发人员需要根据本地路径调整replace指令,或者使用相对路径:

replace custom/package_name_a => ../custom/package_name_a
回到顶部