Hey everyone,

I was wondering if I can get some ideas on how to solve this dependency 
problem with Go modules. I am using Go 1.11.4 on Linux (Windows Subsystem 
for Linux to be exact).

The first part of the problem is that for one of my libraries, I am 
importing github.com/hashicorp/vault/api, which is an api client to access 
Vault servers. This package is pretty thin and does not contain a lot of 
dependencies. However, the root project at github.com/hashicorp/vault has 
quite a few dependencies.
If I delete the current go.mod and go.sum files in my library and start 
from scratch:
- I run go mod init github.com/username/mylibrary
- I then run go mod tidy to add missing packages to my go.mod and generate 
a go.sum

Go mod imports the Vault repository at its root 
(github.com/hashicorp/vault) as expected. Unfortunately, this pulls in a 
lot of subdependencies and I have a ton of indirect dependencies in my 
go.mod and go.sum. This is not unexpected of course as this is how go 
modules work. Unfortunately, this does slow down continuous integration 
builds and is probably not great for Github and VCS hosts as each build 
pulls in all of these unneeded dependencies.

The second problem is that 2 of Vault's subdependencies (not sure how deep) 
is labix.org/v2/mgo and launchpad.net/gocheck. These are bazaar repos, so 
they necessitate the installation of the bzr tool. In my library, I added 
the following to my go.mod to force it to pull from the Github repos:

replace labix.org/v2/mgo => github.com/go-mgo/mgo 
v0.0.0-20160801194620-b6121c6199b7

replace launchpad.net/gocheck => github.com/go-check/check 
v0.0.0-20180628173108-788fd7840127

This works great for running tests in the username/mylibrary repo as I no 
longer need to install bzr when running my CI builds. However, if I create 
another project such as github.com/username/some-project and import 
username/mylibrary, go mod will attempt to download launchpad.net/gocheck 
and labix.org/v2/mgo from the original bazaar repos when running go test 
and other commands.These causes errors such as `go: 
labix.org/v2/mgo@v0.0.0-20140701140051-000000000287: bzr branch 
--use-existing-dir https://launchpad.net/mgo/v2 . in 
/go/pkg/mod/cache/vcs/ca61c737a32b1e09a0919e15375f9c2b6aa09860cc097f1333b3c3d29e040ea8:
 
exec: "bzr": executable file not found in $PATH `. This is quite annoying 
and I'd like to avoid having to add those `replace` statements in the 
go.mod of projects that consume the mylibrary package. In addition, 
consumers of my library would need to install bazaar (which most people 
probably won't have installed).

The 2 options I have thought of are:
1. Ask the Vault team to extract the api package into a separate 
repository. I am not sure how likely they would be interested in doing 
this, but I am guessing it would be quite low.
2. Make a copy of the api package and copy it directly into my library. 
This is something I am hoping to avoid as much as possible, because I'd 
like to use go modules to manage my dependencies.

Are there any other options I've missed?

Cheers,
Francis

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to