Recently, I wanted to import a go library into my bazel workspace that uses a moduled version of another library that already exists as an unmoduled version in the workspace. Here’s how I made gazelle generate right dependencies.
My workspace already contains the unmoduled
I want to import
github.com/bradleyfalzon/ghinstallation, which depends on
WORKSPACE file that successfully imported the dependencies:
# The unmoduled go-github. go_repository( name = "com_github_google_go_github", importpath = "github.com/google/go-github", commit = "80d007d8679f58cc1bcc9647849501219ea831ca", ) # v29 go-github module. go_repository( name = "com_github_google_go_github_v29", importpath = "github.com/google/go-github/v29", sum = "h1:IktKCTwU//aFHnpA+2SLIi7Oo9uhAzgsdZNbcAqhgdc=", version = "v29.0.3", ) go_repository( name = "com_github_bradleyfalzon_ghinstallation", importpath = "github.com/bradleyfalzon/ghinstallation", tag = "v1.1.1", )
Without the separately named
com_github_google_go_github_v29 repository rule,
gazelle is going to resolve the go import path
github.com/google/go-github/v29 to a non-existent
v29 package under
@com_github_google_go_github, as shown in the following error message:
ERROR: Analysis of target ‘@com_github_bradleyfalzon_ghinstallation//:go_default_library’ failed; build aborted: no such package ‘@com_github_google_go_github//v29/github’: BUILD file not found in directory ‘v29/github’ of external repository @com_github_google_go_github. Add a BUILD file to a directory to mark it as a package.
Ideally I would only use one version of the library in my codebase to avoid surprises. But it’s great that bazel and gazelle are flexible enough to support multiple versions of the same dependency!