Gogradle supports private repository and repository url substitution. Actually, it supports registry mirrors. You can declare repositories in repositories
block of build.gradle
.
For example, you may want to substitute a specific package with your own implementation, just do as follows:
repositories{
golang {
root 'github.com/package/to-be-hacked'
vcs 'hg' // optional, git by default
url 'http://my-repo.com/my/implementation.git'
}
}
In the DSL above, root
and url
can be any object, not only string. Gogradle will use built-in Groovy method Object.isCase()
to test if it matches the declaration.
Actually, you can use regular expressions and closures. The following example demonstrates how to use a mirror registry of github.com
.
repositories {
golang {
root ~/github\.com\/[\w-]+\/[\w-]+/
url { path->
def split = path.split('/')
"https://my-repo.com/${split[1]}/${split[2]}"
}
}
}
Another application scenario are bitbucket
private repo. It has been reported here that
Go does not support bitbucket
private repo since it need to use unauthenticated http request to query the vcs type and url. With Gogradle, you can solve this problem gracefully:
repositories {
golang {
root ~/bitbucket\.org\/myprivaterepo\/[\w-]+/
vcs 'hg'
url {
"ssh://[email protected]/myprivaterepo/${it.split('/')[2]}"
}
}
}
Moreover, you can declare a local directory as dependency package.
repositories {
golang {
root '/the/repo/root'
dir '/path/to/my/own/implmentation'
}
}
Sometimes, we need to ignore a package globally, for example, appengine
. You can use emptyDir()
to achieve this:
repositories {
golang {
root 'appengine'
emptyDir()
}
}
NOTE the root
declaration must match root path only. You can't declare a root
matching both root path and non-root path:
repositories {
golang {
root {it.startsWith('github.com')} // DONOT DO THIS!
...
}
}
Gitlab implementation doesn't conform go import convention completely, see the discussion. In this situation, Gogradle might not be able to recognize package structure in vendor
correctly, which leads to weird issues. You need to add the following configuration into your build.gradle
:
repositories {
golang {
incomplete ~/yourgitlab\.com(\/\w+)?/
}
}
This tells Gogradle: path like yourgitlab.com
and yourgitlab.com/username
is not a project root path.
This has been fixed in Gitlab 9.5.