【问题标题】:How to define a helper method for gradle repository?如何为 gradle 存储库定义辅助方法?
【发布时间】:2017-07-31 17:58:30
【问题描述】:

Gradle 脚本具有定义常见知名存储库的快捷功能,例如

repositories {
    mavenCentral()
}

我想定义我自己的快捷函数,比如myPrivateMavenRepo(),这样我就可以编写类似的东西

repositories {
    mavenCentral()
    myPrivateMavenRepo()
}

而不是

repositories {
    mavenCentral()
    maven {
        url "http://repo.mycompany.com/maven2"
    }
}

问题:

  • 如何开发自定义 repo 函数?
  • 此自定义函数托管在哪里?
  • 我有很多要切换到 gradle 的 repos 我不想使用 repo Url 对每个 build.gradle 文件进行硬编码 如何以易于引导的方式集中这些文件?

【问题讨论】:

标签: java gradle build.gradle


【解决方案1】:

repositories 闭包中的方法由RepositoryHandler 接口定义。虽然mavenCentral()mavenLocal()jcenter() 添加了预定义的存储库,但所有其他方法都需要配置闭包、操作或映射,它们将应用于新的ArtifactRepository

一种简单的方法是定义此类配置闭包、操作或映射,并通过插件扩展提供它们:

repositories {
    mavenCentral()
    maven myPluginExtension.myRepoClosure
}

由于RepositoryHandler也是ArtifactRepositoryContainer,你可以直接使用add等修改方法来创建和注册ArtifactRepository对象:

repositories {
    jcenter()
    add myPluginExtension.myRepo
}

如果你想直接向RepositoryHandler添加方法,你可以alter its meta class。请注意,这是 Groovy 的一项功能,因此您只能在 Groovy 插件中使用此功能,而不能在 Java 插件中使用。

project.repositories.metaClass.myRepo {
    // implement logic to add repository (e.g. call maven(closure) ...)
}

该方法将在您的构建脚本中可用:

repositories {
    mavenLocal()
    myRepo()
}

【讨论】:

  • 无论哪种方式都失败了:“Could not find method myRepo() for arguments [] on repository container of type org.gradle.api.internal.artifacts.dsl.DefaultRepositoryHandler.”消息。
  • 至少如果 1. 放在单独的文件中, 2. 像“apply from: './my-repo.gradle'”一样导入 3. 最后,像“allprojects { repositories { myRepo() } }”一样使用
【解决方案2】:

我认为你可能会这样做

allprojects {
    repositories.ext.myPrivateMavenRepo = {
        repositories.maven {
           url: 'http://repo.mycompany.com/maven2'
       } 
    } 
} 

用法

repositories {
    myPrivateMavenRepo() 
} 

你可以很容易地把它变成一个插件

【讨论】:

    猜你喜欢
    • 2015-12-25
    • 1970-01-01
    • 2018-09-25
    • 2015-11-12
    • 2011-06-11
    • 2011-11-19
    • 2013-06-11
    • 1970-01-01
    • 2016-11-25
    相关资源
    最近更新 更多