gpt4 book ai didi

go - 跨多个项目构建具有 vendor 依赖关系的 Go 项目

转载 作者:IT王子 更新时间:2023-10-29 01:46:55 25 4
gpt4 key购买 nike

好的,所以我在 Go 中有几个项目都共享同一组结构来表示我的数据库模式。因此,为了避免代码不同步,我将所有结构移到了它们自己的“模型”项目中。我的文件夹结构是这样的

GOPATH
- src
- project1
- project2
- models
- pkg
- bin

模型定义了一些方法来从数据库中获取记录,但是由于每个项目都需要控制自己的数据库连接池,所以我将数据库连接作为参数传递给模型方法,所以在模型中我有类似

import (
"github.com/jmoiron/sqlx"
_ "github.com/lib/pq"
)

type User struct {
...
}

type UserList []User

func (u *UserList) FetchAll(db *sqlx.DB) {
...
}

在项目代码中,我有类似的东西

import (
"github.com/jmoiron/sqlx"
_ "github.com/lib/pq"

. "models"
)

func UserListAPI(c *gin.Context) {
var users UserList
db := GetDBConnection()
users.FetchAll(db)
c.JSON(200, users)
}

但是现在,当我尝试构建时,出现错误

不能在给用户的参数中使用 db (type *"project1/vendor/github.com/jmoiron/sqlx".DB) 作为类型 *"models/vendor/github.com/jmoiron/sqlx".DB .FetchAll

有没有办法在不彻底改变我的项目结构的情况下解决这个问题?

我正在使用 dep 来管理我的依赖项。

最佳答案

这是一个使用 src 目录的解决方案:

  1. 将您的 GOPATH 设置为您的项目根目录。
  2. 在您的项目根目录中创建一个src 目录。您所有的 Go 代码都应该存放在这里。
  3. src 目录中,创建一个 vendor 目录。你所有的第三方包都应该放在这里。 GVT 等依赖管理工具会为您将第三方包直接安装到此文件夹。

所以你的项目应该是这样的:

- bin
- pkg
- src
- project1
- project2
- models
- vendor
- github.com
...

要在您的代码中导入第三方包(例如从 github.com),您只需直接使用 github 路径,如 import "github.com/foo/bar"。 Go 编译器将使用您的 GOPATH 来确定 github.com/foo/bar 实际上位于 $GOPATH/src/vendor/github.com/foo/bar

要导入本地包,只需直接使用您的本地路径,如import "models"。 Go 编译器将使用您的 GOPATH 来确定 models 实际上位于 $GOPATH/src/models


更新

根据我们下面的对话,您有两个选择:

  1. 将所有项目的依赖项合并到一个位于 $GOPATH/src/vendor 的 vendor 文件夹中。
  2. 使用独立的项目并根据您当前正在处理的项目将您的 GOPATH 切换到新的项目根目录。

我会采用方法 2 来保持事物的清洁和独立。

要实现#2,您可以创建如下结构:

- project1
- bin
- pkg
- src
- vendor
- project2
- bin
- pkg
- src
- vendor

要在 project1 上工作,请将 GOPATH 设置为 project1 的根目录。 project2 和您拥有的任何其他项目也是如此。

我上面说的其他所有内容应该仍然适用,因为这些项目仍然各自遵循相同的结构,但现在我们也满足了为每个项目提供唯一的 vendor 目录的要求。

我知道这不是“无缝”的,因为你必须切换你的 GOPATH,但我几乎不认为这有什么大不了的,因为你只会在蓝色的月亮上做一次,而且需要半个第二。此外,Golang 并不是专门为满足此类项目结构要求而设计的,尽管它足够灵活,可以毫不费力地运行它(您所要做的就是切换 GOPATH)。

您甚至可以通过编写别名来为您更改某些项目的 GOPATH 来进一步自动化。例如,要真正快速地切换到 project1,您可以创建一个运行命令 export GOPATH=/path/to/project1 的别名 project1


更新 2

以下是我如何构建我的个人项目,它实现了你想要实现的一切:

- bin
- pkg
- src
- vendor
- core
- apps
- foo.com
- api.foo.com
- auth.foo.com

如您所见,在 apps 文件夹中我有多个“项目”(尽管实际上这些只是不同的二进制文件/HTTP 服务器)。

您还会看到我有一个 core 目录。这是我所有共享逻辑所在的地方。 apps 文件夹中的每个项目都可以毫无问题地从 core 导入,因为它们都在同一个 GOPATH 命名空间中。

关于go - 跨多个项目构建具有 vendor 依赖关系的 Go 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51617301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com