我已经开始学习 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存储库(甚至是子模块)。如果有某种模式可以完成这项工作,那么可能会使我原来的问题无济于事。
答案 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
)