我正在考虑将maven构建移植到gradle。 maven的一个特性是pom inheritance,我可以在pom中声明各种常见行为,将其发布到存储库,然后通过具体项目中的<parent>
元素使用它。
我的Q只是在gradle中是否存在等效行为?
我之前在ant + ivy中通过导入一个公共build.xml来完成这个任务,该build.xml依赖于已经从源代码控制中检查公共build.xml的位置或使用svn:externals之类的东西。我可以毫无困难地重复这种方法,但这似乎是maven非常好的一件事,所以在gradle中看到类似的东西会很高兴。
答案 0 :(得分:20)
有两种可能性:
将构建脚本发布到Web服务器,并将其包含在apply from: "http://path/to/script.gradle"
编写Gradle插件,将其作为Jar发布到Maven或Ivy存储库,并将其包含在:
buildscript {
repositories { .. }
dependencies "mygroup:myplugin:1.0"
}
apply plugin: "myplugin"
第二种选择更复杂,但也更强大。例如,插件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}}'
答案 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