我正在开发一组项目,每个项目都使用Gradle作为构建工具。这不是一个多项目设置,尽管我希望能够在每个项目中重复使用一些常见的Gradle脚本,以保证项目相关的一致性。
例如,对于Java组件,我希望生成的JAR文件中的清单文件具有相同的信息。特别是,所有项目都将具有相同的主要和次要版本号,而补丁版本将是项目特定的。
这是我迄今为止所做的尝试:
master.gradle
- 在项目间共享
group 'com.example'
ext.majorVersion = 2
ext.minorVersion = 3
ext.patchVersion = 0; // Projects to override
def patchVersion() {
return patchVersion;
}
apply plugin: 'java'
jar {
manifest {
attributes 'Bundle-Vendor': 'Example Company',
'Bundle-Description': 'Project ABC',
'Implementation-Title': project.name,
'Implementation-Version': majorVersion + '.' + minorVersion + '.' + patchVersion()
}
}
build.gradle
- 其中一个项目
apply from: 'master.gradle'
patchVersion = 3
task hello {
println 'Version: ' + majorVersion + '.' + minorVersion + '.' + patchVersion
}
如果我从命令行运行gradle hello jar
,我会从Version: 2.3.3
任务获得hello
。但是,JAR文件清单包含2.3.0
,这不是我想要的。如何在清单中获得正确的补丁版本?更一般地说,我如何让项目向主脚本提供信息?
答案 0 :(得分:0)
根据@Oliver Charlesworth的建议,我想出了以下内容。我必须编写一个简单的插件来保存版本信息并将其用作扩展对象。请注意(根据gradle文件中的注释的建议),应用和设置项目的顺序非常重要。不同的排序会导致编译器错误或在设置之前使用的值。
如果有人想提出改进建议,请这样做。
master.gradle
group 'com.example'
// N.B. The individual project must have applied the semantic version
// plugin and set the patch version before applying this file.
// Otherwise the following will fail.
// Specify the major and minor version numbers.
project.semver.major = 2
project.semver.minor = 3
project.version = project.semver
apply plugin: 'java'
jar {
manifest {
attributes 'Bundle-Vendor': 'Example Company',
'Bundle-Description': project.description,
'Implementation-Title': project.name,
'Implementation-Version': project.semver
}
}
build.gradle
// Describe the project before importing the master gradle file
project.description = 'Content Upload Assistant'
// Specify the patch version
apply plugin: SemanticVersionPlugin
project.semver.patch = 3
// Load the master gradle file in the context of the project and the semantic version
apply from: 'master.gradle'
简单的插件可以在下面找到。目前它与应用程序源代码一起使用,但它应该与主gradle文件一起移出到库中。
buildSrc/src/main/groovy/SemanticVersionPlugin.groovy
import org.gradle.api.Plugin
import org.gradle.api.Project
class SemanticVersionPlugin implements Plugin<Project> {
void apply(Project project) {
project.extensions.create('semver', SemanticVersion)
}
}
class SemanticVersion {
int major
int minor
int patch
String toString() {
return major + '.' + minor + '.' + patch
}
}