我想制作一个自定义buildScript
存储库方法,以便我可以轻松引用我们的内部maven存储库。现在,我需要在我们使用插件的任何地方声明maven
块。
这是当前的设置
buildscript {
repositories {
jcenter()
maven { url 'http://myNexus:8081/nexus/content/repositories/My-Release' }
}
dependencies {
classpath 'com.example.plugin:my-plugin:1+'
}
}
我想做的是这样的事情
buildscript {
repositories {
jcenter()
myReleaseRepo()
}
dependencies {
classpath 'com.example.plugin:my-plugin:1+'
}
}
如何在将来可能使用该插件的任何地方创建一个可用于创建存储库的方法?
答案 0 :(得分:2)
可以将一个repo添加到一个init脚本,然后该脚本将应用于使用init脚本的所有gradle调用 - 而不必在每个build.gradle中单独声明你的maven repo。
部分解决方案,完全不是您要求的内容。在init.gradle
:
allprojects{
buildscript{
repositories{
maven{ url 'http://myNexus:8081/nexus/content/repositories/My-Release' }
}
}
}
然后你的build.gradle
可以完全跳过buildscript repo声明:
buildscript {
dependencies {
classpath 'com.example.plugin:my-plugin:1+'
}
}
实际上,您甚至可以将buildscript类路径声明移动到init,并将插件应用于使用init脚本的所有项目:
更加强大init.gradle
allprojects{
buildscript{
repositories{
maven{ url 'http://myNexus:8081/nexus/content/repositories/My-Release' }
}
dependencies {
classpath 'com.example.plugin:my-plugin:1+'
}
}
}
为您提供了轻量级build.gradle
apply plugin: 'my-plugin'
我试过,但显然你也无法将申请行移到init.gradle
。见this defect。
我撤回了我在上面的评论中所说的内容,我想出了如何完全你要求的内容。显然,您可以使用initscript为buildscript块创建扩展。但是我仍然更喜欢solution2,因为它为您提供了更清晰的build.gradle。
要在init.gradle
:
class customRepos {
def buildscript
customRepos(buildscript) {
this.buildscript = buildscript
}
void addMyRepo() {
buildscript.repositories {
maven{ url 'http://myNexus:8081/nexus/content/repositories/My-Release' }
}
}
}
allprojects {
extensions.create('myRepo', customRepos, buildscript)
}
然后允许您在build.gradle
buildscript{
myRepo.addMyRepo()
dependencies {
classpath 'com.example.plugin:my-plugin:1+'
}
}
apply plugin: 'my-plugin'
答案 1 :(得分:2)
另一个解决方案是使用一些Groovy优点在RepositoryHandler上添加自定义方法。只需将其放入~/.gradle/init.gradle
RepositoryHandler.metaClass.myReleaseRepo = {
delegate.maven {
name 'myReleaseRepo'
url 'http://myNexus:8081/nexus/content/repositories/My-Release'
}
}
之后,你可以像你描述的那样使用它:
buildscript {
repositories {
myReleaseRepo()
}
}
Groovy中的元类非常棒。在这种情况下,委托与javascript this
非常相似。此代码基本上使用RepositoryHandler
实例(委托关键字),只调用repositoryHandlerInstance.maven(name, url)
。