使用跨多个项目的供应商依赖性构建Go项目

时间:2018-07-31 15:44:24

标签: go

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

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

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

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)
}

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

cannot use db (type *"project1/vendor/github.com/jmoiron/sqlx".DB) as type *"models/vendor/github.com/jmoiron/sqlx".DB in argument to users.FetchAll

有什么方法可以解决这个问题而无需大幅度改变我的项目结构?

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

1 个答案:

答案 0 :(得分:0)

这是使用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的一个供应商文件夹中。
  2. 使用隔离的项目,然后根据当前正在处理的项目将GOPATH切换到新的项目根目录。

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

要实现第2个目标,您可以创建如下结构:

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

要处理project1,请将GOPATH设置为project1的根。 project2和您拥有的任何其他项目也是如此。

我上面所说的所有其他内容仍然适用,因为这些项目仍单独遵循相同的结构,但是现在我们还满足了为每个项目拥有唯一的供应商目录的要求。

我知道这不是“无缝”的,因为您必须切换自己的GOPATH,但我几乎认为这没什么大不了的,因为您只会在蓝色的月亮中这样做一次,而且需要花费半个小时第二。另外,Golang并不是专门为满足此类项目结构要求而设计的,尽管它足够灵活以使其能够毫无麻烦地工作(您要做的就是切换GOPATH)。

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


更新2

这是我构建个人项目的方式,该项目可以实现您要实现的所有目标:

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

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

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