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

时间:2012-03-02 20:35:49

标签: maven maven-3 gradle

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

我的Q只是在gradle中是否存在等效行为?

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

9 个答案:

答案 0 :(得分: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"
    
  3. 第二种选择更复杂,但也更强大。例如,插件Jars将被缓存,而远程构建脚本当前不会。一般来说,我建议从1.开始,然后移动到2.如果有必要的话。在未来,Gradle可能会提供一种机制,它将易用性1与2的优势结合起来。

答案 1 :(得分:13)

我目前的解决方案是选项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'

这似乎做了我想做的事。

答案 2 :(得分: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()
}

只是我的两分钱。 : - )

答案 3 :(得分: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'

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

答案 4 :(得分:6)

我的版本:

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 }

答案 5 :(得分:2)

这是对已接受的解决方案的改进,因为当您在您的构建中有多个依赖项时:

buildscript {
    repositories {
        // Repositories
    }
    dependencies { 
        classpath 'com.foo.bar:project-extension:1.0.0'
        classpath 'com.foo.bar:some-dependency-1:2.0.0'
        classpath 'com.foo.bar:other-dependency-1:3.0.0'
    }
    dependencies {
        delete "gradle/ext"
        def jars = configurations.classpath.files as List<File>
        ant.unjar src: jars.find { it.name.matches '.*project-extension.*' }, dest: 'gradle/ext'
    }
}

apply from: 'gradle/ext/common.gradle'

对我来说就像一个魅力。

答案 6 :(得分:1)

我喜欢你的方法@ user3394219

我写了一个小插件做类似的事情:

plugins {
    id "com.orctom.applyscript" version "1.1"
}
applyscript '{{groupA}}:{{nameA}}:{{versionA}}/{{path-of-fileA.gradle}}'
applyscript '{{groupA}}:{{nameA}}:{{versionA}}/{{path-of-fileB.gradle}}'
applyscript '{{groupA}}:{{nameA}}:{{versionB}}/{{path-of-fileC.gradle}}'
applyscript '{{groupC}}:{{nameD}}:{{versionE}}/{{path-of-fileX.gradle}}'

plugins {
    id "com.orctom.applyscript" version "1.1"
}
dependencies {
    scripts '{{groupA}}:{{nameA}}:{{versionA}}'
    scripts '{{groupA}}:{{nameA}}:{{versionB}}'
    scripts '{{groupC}}:{{nameD}}:{{versionE}}'
}

applyscript '{{nameA}}-{{versionA}}/{{path-of-fileA.gradle}}'
applyscript '{{nameA}}-{{versionA}}/{{path-of-fileB.gradle}}'
applyscript '{{nameA}}-{{versionB}}/{{path-of-fileC.gradle}}'
applyscript '{{nameD}}-{{versionE}}/{{path-of-fileX.gradle}}'

https://plugins.gradle.org/plugin/com.orctom.applyscript

答案 7 :(得分:1)

直接在jar中读取通用脚本,如下所示。不需要打开包装袋。

apply from:this.getClass()。getClassLoader()。getResource(“path to dependency.gradle”)

答案 8 :(得分:0)

我发现共享构建脚本有两个主要问题:

  • 如何分发共享脚本。
  • 如何使其可配置和可重复使用以满足您的所有需求。

我把它放在一个罐子里。我将那个 jar 发布到 Maven Central。

我通过在脚本中创建 defaultCOnfig 使其可重复使用。以及使用它的项目中的 buildConfig。这些在脚本中合并以创建有效的配置。

我的项目可能有 build.gradle 看起来像这样:

apply plugin: 'java'

buildscript {
 repositories { mavenCentral() mavenLocal() }
 dependencies { classpath 'se.bjurr.gradle:gradle-scripts:2.+' }
}
project.ext.buildConfig = [
  publishing: [
    relocate: [
      "org:org",
      "com:com"
    ]
  ],
  manifest: [
    mainClass: 'se.bjurr.gitchangelog.main.Main'
  ]
]
apply from: project.buildscript.classLoader.getResource('main.gradle').toURI()


dependencies {
 ...
}

我的代码在这里: https://github.com/tomasbjerre/gradle-scripts

我也在这里写了博客: https://tomas-bjerre85.medium.com/a-sustainable-pattern-with-gradle-e8bf6eb746ff