Gradle自定义buildScriptRepository方法

时间:2016-02-08 20:47:16

标签: gradle build.gradle

我想制作一个自定义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+'
    }
}

如何在将来可能使用该插件的任何地方创建一个可用于创建存储库的方法?

2 个答案:

答案 0 :(得分:2)

可以将一个repo添加到一个init脚本,然后该脚本将应用于使用init脚本的所有gradle调用 - 而不必在每个build.gradle中单独声明你的maven repo。

解决方案1:

部分解决方案,完全不是您要求的内容。在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+'
    }
}

解决方案2:

实际上,您甚至可以将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

解决方案3:

我撤回了我在上面的评论中所说的内容,我想出了如何完全你要求的内容。显然,您可以使用initscript为buildscript块创建扩展。但是我仍然更喜欢solution2,因为它为您提供了更清晰的build.gradle。

要在init.gradle

中创建一个buildscript扩展名
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)