Gradle 自定义 buildScriptRepository 方法

JBi*_*gas 5 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+'
    }
}
Run Code Online (Sandbox Code Playgroud)

我想做的是这样的

buildscript {
    repositories {
        jcenter()
        myReleaseRepo()
    }

    dependencies {
        classpath 'com.example.plugin:my-plugin:1+'
    }
}
Run Code Online (Sandbox Code Playgroud)

如何提供一种方法来在我们将来可能使用该插件的任何地方创建存储库?

RaG*_*aGe 2

可以将存储库添加到 init 脚本中,然后该存储库将应用于使用该 init 脚本的所有 gradle 调用 - 无需在每个 build.gradle 中单独声明您的 Maven 存储库。

解决方案一:

部分解决方案,并不完全符合您的要求。在init.gradle

allprojects{
    buildscript{
        repositories{
            maven{ url 'http://myNexus:8081/nexus/content/repositories/My-Release' }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你build.gradle可以完全跳过 buildscript repo 声明:

buildscript {
    dependencies {
        classpath 'com.example.plugin:my-plugin:1+'
    }
}
Run Code Online (Sandbox Code Playgroud)

解决方案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+'
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

给你一个打火机build.gradle

apply plugin: 'my-plugin'
Run Code Online (Sandbox Code Playgroud)

我尝试过,但显然你也无法将应用线移动到init.gradle。看到这个缺陷

解决方案3:

我收回我在上面的评论中所说的话,我想出了如何完全按照你的要求去做。显然,您可以使用 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)
}
Run Code Online (Sandbox Code Playgroud)

然后你可以在你的build.gradle

buildscript{
    myRepo.addMyRepo()

    dependencies {
        classpath 'com.example.plugin:my-plugin:1+'
    }
}

apply plugin: 'my-plugin'
Run Code Online (Sandbox Code Playgroud)