gradle构建工具学习系列
在前面几章当中,在构建脚本当中定义了两个Groovy类:ProjectVersion和自定义的task ReleaseVersionTask。这些类最适合被移到项目的buildSrc目录下。将构建代码放到buildSrc目录下是一个良好的软件开发实践。
Gradle在buildSrc目录下使源文件结构标准化。Java代码需要被放在src/main/java目录下,Groovy代码则放在src/main/groovy目录下,位于这个目录下的代码都会被自动编译,并且被加入到Gradle构建脚本的classpath中,buildSrc目录是组织代码的最佳方式。因为要处理这些类,所以也可以把它们放到指定的包下,比如com.manning.gia包的一部分。
最后文件内容分别如下所示
buildSrc/src/main/groovy/com/manning/gia/ProjectVersion.groovy
package com.manning.gia
class ProjectVersion {
Integer min
Integer maj
Boolean prodReady
@Override
String toString() {
"$maj.$min${prodReady ? '' : '-SNAPSHOT'}"
}
}
buildSrc/src/main/groovy/com/manning/gia/ReleaseVersionTask.groovy
package com.manning.gia
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.TaskAction
class ReleaseVersionTask extends DefaultTask {
@Input Boolean release
@OutputFile File destFile
ReleaseVersionTask() {
group = 'versioning'
description = 'Makes project a release version.'
}
@TaskAction
void start() {
project.version.prodReady = true
ant.propertyfile(file: destFile) {
entry(key: 'release', type: 'string', operation: '=', value: 'true')
}
}
}
而构建脚本则不再包含类信息了
ext.versionFile = file('project-version.properties')
task loadVersion {
project.version = readVersion()
}
ProjectVersion readVersion() {
logger.quiet 'Reading the version file.'
if (!versionFile.exists()) {
throw new GradleException("Required version file does not exit: $versionFile.canonicalPath")
}
Properties versionProps = new Properties()
versionFile.withInputStream { stream ->
versionProps.load(stream)
}
new ProjectVersion(min: versionProps.major.toInteger(), maj: versionProps.minor.toInteger(), prodReady: versionProps.release.toBoolean())
}
task makeReleaseVersion(type: ReleaseVersionTask) {
release = version.prodReady
destFile = new File('project-version.properties')
}



