如何通过存储库共享公共build.gradle?

Mat*_*att 25 gradle maven-3 maven

我正在考虑将maven构建移植到gradle.maven的一个特性是pom继承,我可以在pom中声明各种常见行为,将其发布到存储库,然后通过<parent>具体项目中的元素使用它.

我的问题就是gradle中是否存在等效行为?

我以前在ant + ivy中通过导入一个公共的build.xml来完成这个任务,这个build.xml依赖于已经从源代码控制中检查了公共build.xml的位置或使用了类似svn:externals的东西.我可以毫无困难地重复这种方法,但这似乎是maven做得很好的一件事,所以在gradle中看到类似的东西会很高兴.

Pet*_*ser 20

有两种可能性:

  1. 将构建脚本发布到Web服务器,并将其包含在内 apply from: "http://path/to/script.gradle"

  2. 编写Gradle插件,将其作为Jar发布到Maven或Ivy存储库,并将其包含在:

    buildscript {
        repositories { .. }
        dependencies "mygroup:myplugin:1.0"
    }
    
    apply plugin: "myplugin"
    
    Run Code Online (Sandbox Code Playgroud)

第二种选择更复杂,但也更强大.例如,插件Jars将被缓存,而远程构建脚本当前不会.一般来说,我建议从1.开始,然后移动到2.如果有必要的话.在未来,Gradle可能会提供一种机制,它结合了易用性1和2的优点.


Mat*_*att 14

我目前的解决方案是选项3; 将常用脚本作为资源打包到jar中,然后在buildscript部分中解压缩

buildscript {
    repositories {
        // enterprise repo here
    }
    dependencies { 
        classpath 'com.foo.bar:common-build:0.1.0-SNAPSHOT'
    }
    dependencies {
        ant.unjar src: configurations.classpath.singleFile, dest: 'build/gradle'
    }
}

apply from: 'build/gradle/common.gradle'
Run Code Online (Sandbox Code Playgroud)

这似乎做我想要的.

  • 我不太确定我是应该为自己的创造力感到骄傲还是因为我的hackery而感到羞耻.收益是一种显而易见的(对我而言)共享特定版本的公共构建的方式,该构建定义了要构建的项目集的密切相关(但不是同一个多项目构建的一部分)的标准方法.我已经减少了以前的基于本地会议的ant + ivy构建(在几千行xml +所有模块特定的ivy.xml中),减少到几百行的常见构建脚本(主要处理av该构建的特定部分和标准deps)所以我很高兴. (3认同)
  • fwiw上述方法有利于原型设计,但最终已经稳定到几个插件. (2认同)

Pat*_*ner 13

在Matt的解决方案上的建筑物,我发现以下更清洁:

buildscript {
  repositories {
    <your repos>
  }
  dependencies {
    classpath '<your jar>'
  }
}

afterEvaluate { project -> // afterEvaluate for resolving the build script dependency
  apply from: project.buildscript.classLoader.getResource('path/to/your/resource/in/the/jar').toURI()
}
Run Code Online (Sandbox Code Playgroud)

只是我的两分钱.:-)


小智 8

我有一个答案和另一个问题:

首先,要从存储库(即Nexus)访问共享文件,您可以构建包含查询的URL:

apply from: 'http://server-url/nexus/service/local/artifact/maven/redirect?r=repository-name&g=group-name&a=build-common&e=gradle&v=LATEST'
Run Code Online (Sandbox Code Playgroud)

我为我们的项目做了这个,效果很好.我可以在单独的SVN项目中管理'build-common.gradle'文件,并将其作为SNAPSHOT上传到Nexus.上面的URL(为'server-url','repository-name'和'group-name'插入了适当的值)找到我上传的.gradle脚本的最新SNAPSHOT.无需将其包装在罐子里.


use*_*219 7

我的版本:

repositories {  
    <your repos>
}  
configurations {   
    scripts   
}  
dependencies {  
    scripts group: 'org.foo', name: 'build', version: '1.0.0', ext: 'gradle' 
    // add more scrips if needed 
}  
configurations.scripts.resolve().each { apply from: it }
Run Code Online (Sandbox Code Playgroud)