我们有3-5个不同的项目。我不希望每次从一个项目到另一个项目的配置的某些部分(如添加常见的maven存储库)复制/粘贴。在不同项目中共享通用配置的最佳方法是什么?
我使用了apply from: "http://path/to/common.build.gradle"
构造,但我们的架构师认为这不是最佳解决方案,因为项目构建依赖于存储common.build.gradle
的外部服务器。如果您没有与此服务器的连接,则无法构建项目。你怎么看待这件事?
答案 0 :(得分:4)
在构建之间共享配置的最可靠方法是将其编码为插件类(即实现org.gradle.api.Plugin
接口的类),将其作为Jar发布到Maven或Ivy存储库,并将其拉出来使用buildscript
块消耗构建。这将确保插件Jar像任何其他工件依赖项一样被缓存。如何解决这个问题在Gradle User Guide中有解释。
答案 1 :(得分:1)
我发现最简单的方法是:
apply from: 'http://acme.com:8081/artifactory/libs-release-local/gradle/common.gradle'
请注意,Gradle会缓存common.gradle,因此当您离线时,可以使用--ofline选项(gradle --ofline build
)运行gradle,如果文件位于缓存中,则构建仍然有效
有some gotchas需要注意。具体来说,您需要在common.gradle中使用旧的插件机制并使用完全限定的类名(没有任何引号,因为它是类引用)。见下面的要点:
buildscript {
// Have to use old plugin mechanism if not in build.gradle
// https://discuss.gradle.org/t/how-do-i-apply-a-plugin-to-a-project-from-a-shared-applied-gradle-file/7508/15
repositories {
jcenter()
}
dependencies {
classpath "org.jfrog.buildinfo:build-info-extractor-gradle:latest.release"
classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.6.2"
classpath "pl.allegro.tech.build:axion-release-plugin:1.9.1"
}
}
apply plugin: org.jfrog.gradle.plugin.artifactory.ArtifactoryPlugin
apply plugin: org.sonarqube.gradle.SonarQubePlugin
apply plugin: pl.allegro.tech.build.axion.release.ReleasePlugin
虽然这种方法简单而快速,但它的缺点是你的构建过程不是依赖管理和源代码控制,使其无法预测和不确定。