多个go项目并共享供应商目录(在1.11之前的go中)

时间:2018-10-31 15:17:54

标签: go version-control

我已经开始学习 go (1.7.4),并且有一个项目目前可以生成两个可执行文件。按照标准的go布局,我具有以下目录结构:

GOPATH=`pwd`
bin
src/
src/<project1>
src/<project1>/vendor
src/<project1>/glide.yaml
src/<project2>
src/<project2>/vendor
src/<project2>/glide.yaml
pkg/

项目1和项目2共享很多依赖项。 是否可以在project1和project2之间共享供应商目录,并且仍然固定版本以确保可复制的构建?

我不想为每个项目重复glide.yaml和vendor目录,因为它会使构建the肿并违反DRY。

pkg目录显然是执行此操作的方法,但与供应商不同,我没有像glide这样的依赖项管理器工具来确保使用特定版本(另请参见我的related question)。

一个可能相关的问题是该项目的组织方式。我相信在 go 中,将每个项目子目录映射到单个github存储库会更加常规。但是,对于我的项目,我想至少构建两个可执行文件。我知道您可以通过使用不同的程序包名称来做到这一点,但这会使go和glide感到困惑。我努力使它在单个项目下工作,然后决定/发现使用标准的go布局和在两个级别上进行工作都比较容易。例如,一个优点是子目录中的“开始构建”等功能无需命名软件包即可使用。我还可以让我的顶层构建,测试和打包机器在所有项目上运行,并使我的运行环境与其他任何环境分开。 程序不够复杂,无法保证单独的git存储库(甚至是子模块)。如果有某种模式可以完成这项工作,那么可能会使我原来的问题无济于事。

2 个答案:

答案 0 :(得分:1)

应该有一个共享的供应商目录。我的工作方式涉及Go 1.11和称为模块的新Go功能。但是我很确定它应该可以与厂商和工具(例如glide和dep)一起使用。要使用dep / glide,您的目录结构可能看起来像这样

- src
  - projects
      - project1
      - project2
      - vendor
      - Glide.yaml

您可以使用go build -o p1 project1/*.go从项目文件夹或使用go build从单个项目文件夹进行构建

相同的结构,但是在GOPATH之外适用于Go 1.11模块。您必须将GO111MODULE变量设置为“ on”或“ auto”。请注意,使用go模块将依赖项存储在其他位置,并在构建过程中根据需要自动下载它们。

注意:glide github页面建议切换到dep作为更官方的工具

编辑:刚刚用dep测试过。它对我有用。

答案 1 :(得分:1)

我建议您使用新的销售系统-https://github.com/golang/go/wiki/Modules

它允许您修复所用软件包的版本:

module github.com/my/thing

require (
    github.com/some/dependency v1.2.3
    github.com/another/dependency/v4 v4.0.0
)