Gradle 仅当运行特定任务时才执行任务
我希望任务Gradle 仅当运行特定任务时才执行任务,gradle,gradle-task,Gradle,Gradle Task,我希望任务setupDB在且仅在任务fatJar或slimJar运行时执行 但是在添加gradle.taskGraph.whenReady之后,commandLine./scripts/configureSQLiteDB.sh'永远不会为任何任务运行 以下是我的setupDB任务代码: //download bigg.sqlite if not present task setupDB { gradle.taskGraph.whenReady { graph ->
setupDB
在且仅在任务fatJar
或slimJar
运行时执行
但是在添加gradle.taskGraph.whenReady
之后,commandLine./scripts/configureSQLiteDB.sh'
永远不会为任何任务运行
以下是我的setupDB任务代码:
//download bigg.sqlite if not present
task setupDB {
gradle.taskGraph.whenReady { graph ->
if (!project.file("resources/edu/ucsd/sbrg/bigg/bigg.sqlite").exists()
&& (graph.hasTask(slimJar)|| graph.hasTask(fatJar))) {
doFirst {
exec {
println "Setup DB"
commandLine './scripts/configureSQLiteDB.sh'
}
}
}
}
}
您还可以查看build.gradle
文件:
apply plugin: "java"
defaultTasks "clean", "fatJar"
// Java versions for compilation and output
sourceCompatibility = "1.8"
targetCompatibility = "1.8"
archivesBaseName = "ModelPolisher"
version = "1.7"
sourceSets {
main.java.srcDirs = ["src"]
main.resources.srcDirs = ["resources"]
main.resources.excludes = ["**/bigg.zip"]
test.java.srcDirs = ["test"]
}
repositories {
mavenCentral()
maven { url "http://www.ebi.ac.uk/~maven/m2repo" }
maven { url "http://jsbml.sourceforge.net/m2repo/" }
// local dependencies
flatDir {
dirs "lib/de/zbit/SysBio/1390"
}
}
dependencies {
compile "org.sbml.jsbml:jsbml:1.4"
compile "de.zbit:SysBio:1390"
compile "org.xerial:sqlite-jdbc:3.21.0"
compile "org.postgresql:postgresql:42.2.2"
compile "org.biojava:biojava-ontology:5.0.0"
compile "com.diffplug.matsim:matfilerw:3.0.1"
compile "com.fasterxml.jackson.core:jackson-core:2.9.9"
compile "com.fasterxml.jackson.core:jackson-databind:2.9.9"
testCompile "org.junit.jupiter:junit-jupiter-engine:5.1.0"
}
// config for all jar tasks
tasks.withType(Jar) {
dependsOn test
destinationDir = file("$rootDir/target")
manifest {
attributes(
"Version": version,
"Implementation-Title": "ModelPolisher",
"Implementation-Version": version,
"Specification-Vendor": "University of California, San Diego",
"Specification-Title": "ModelPolisher",
"Implementation-Vendor-Id": "edu.ucsd.sbrg",
"Implementation-Vendor": "University of California, San Diego",
"Main-Class": "edu.ucsd.sbrg.bigg.ModelPolisher"
)
}
}
// with dependencies
task fatJar(type: Jar) {
baseName = project.name + "-fat"
from {
configurations.compile.collect {
it.isDirectory() ? it : zipTree(it)
}
}
with jar
}
//with dependencies, without bigg.sqlite
task lightJar(type: Jar) {
exclude("**/bigg.sqlite")
baseName = project.name + "-noDB"
from {
configurations.compile.collect {
it.isDirectory() ? it : zipTree(it)
}
}
with jar
}
// without dependencies and bigg.sqlite
task bareJar(type: Jar) {
exclude("**/bigg.sqlite")
baseName = project.name + "-slim-noDB"
with jar
}
// without dependencies, bigg.sqlite included
// not included in release
task slimJar(type: Jar) {
baseName = project.name + "-slim"
with jar
}
// zip lib folder for release
task zipLibs(type: Zip) {
from "lib"
into "lib"
include "**/**"
archiveName = "lib.zip"
destinationDir = file("target/")
}
// zip script files for release
task zipScripts(type: Zip) {
from "scripts"
into "scripts"
include "**/**"
archiveName = "scripts.zip"
destinationDir = file("target/")
}
// create all three jars for release
task release() {
dependsOn fatJar
dependsOn bareJar
dependsOn lightJar
dependsOn tasks["zipLibs"]
dependsOn tasks["zipScripts"]
// necessary, as order is not defined by dependsOn
bareJar.mustRunAfter classes
// slimJar.mustRunAfter bareJar
lightJar.mustRunAfter slimJar
fatJar.mustRunAfter lightJar
}
// clean up target directory
clean.doFirst {
file(".gradle").deleteDir()
file("target").deleteDir()
}
//download bigg.sqlite if not present
task setupDB {
gradle.taskGraph.whenReady { graph ->
if (!project.file("resources/edu/ucsd/sbrg/bigg/bigg.sqlite").exists()
&& (graph.hasTask(slimJar)|| graph.hasTask(fatJar))) {
doFirst {
exec {
println "Setup DB"
commandLine './scripts/configureSQLiteDB.sh'
}
}
}
}
}
// bump jar version in travis.yml
if (project.file(".travis.yml").exists()) {
task bumpVersionTravis() {
replaceVersion(".travis.yml")
}
processResources.dependsOn bumpVersionTravis
}
// bump jar version in ModelPolisher.sh
if (project.file("./scripts/ModelPolisher.sh").exists()) {
task bumpVersionMP() {
replaceVersion("./scripts/ModelPolisher.sh")
}
processResources.dependsOn bumpVersionMP
}
def replaceVersion(path) {
ArrayList<String> content = new ArrayList<>()
File travisFile = new File(path)
String MPVersion = /ModelPolisher.*\d{1,2}(.\d{1,2}){1,2}.jar/
travisFile.eachLine {
line ->
content.add(line.replaceAll(MPVersion, "ModelPolisher-fat-" +
"${version}.jar"))
}
BufferedWriter writer = new BufferedWriter(new FileWriter(travisFile))
content.each {
line -> writer.writeLine(line)
}
writer.close()
}
apply插件:“java”
defaultTasks“clean”、“fatJar”
//用于编译和输出的Java版本
sourceCompatibility=“1.8”
targetCompatibility=“1.8”
archivesBaseName=“ModelPolisher”
version=“1.7”
源集{
main.java.srcDirs=[“src”]
main.resources.srcDirs=[“资源”]
main.resources.excludes=[“**/bigg.zip”]
test.java.srcDirs=[“test”]
}
存储库{
mavenCentral()
maven{url“http://www.ebi.ac.uk/~maven/m2repo“}
maven{url“http://jsbml.sourceforge.net/m2repo/" }
//局部依赖
弗拉蒂尔{
目录“lib/de/zbit/SysBio/1390”
}
}
依赖关系{
编译“org.sbml.jsbml:jsbml:1.4”
编译“de.zbit:SysBio:1390”
编译“org.xerial:sqlitejdbc:3.21.0”
编译“org.postgresql:postgresql:42.2.2”
编译“org.biojava:biojava本体:5.0.0”
编译“com.diffplug.matsim:matfilerw:3.0.1”
编译“com.fasterxml.jackson.core:jackson-core:2.9.9”
编译“com.fasterxml.jackson.core:jackson数据绑定:2.9.9”
testCompile“org.junit.jupiter:junitjupiter引擎:5.1.0”
}
//配置所有jar任务
tasks.withType(Jar){
德彭森试验
destinationDir=file($rootDir/target)
显示{
属性(
“版本”:版本,
“实施标题”:“ModelPolisher”,
“实施版本”:版本,
“规范供应商”:“加利福尼亚大学圣地亚哥分校”,
“规范标题”:“模型抛光机”,
“实施供应商Id”:“edu.ucsd.sbrg”,
“实施供应商”:“加利福尼亚大学圣地亚哥分校”,
“主要课程”:“教育、ucsd、sbrg、bigg、ModelPolisher”
)
}
}
//有依赖关系
任务fatJar(类型:Jar){
baseName=project.name+“-fat”
从{
configurations.compile.collect{
it.isDirectory()?it:zipTree(it)
}
}
用罐子
}
//有依赖项,没有bigg.sqlite
任务lightJar(类型:Jar){
排除(“**/bigg.sqlite”)
baseName=project.name+“-noDB”
从{
configurations.compile.collect{
it.isDirectory()?it:zipTree(it)
}
}
用罐子
}
//没有依赖项和bigg.sqlite
任务bareJar(类型:Jar){
排除(“**/bigg.sqlite”)
baseName=project.name+“-slim noDB”
用罐子
}
//如果没有依赖项,则包括bigg.sqlite
//不包括在发布中
任务slimJar(类型:Jar){
baseName=project.name+“-slim”
用罐子
}
//要发布的zip lib文件夹
任务zipLibs(类型:Zip){
来自“lib”
进入“自由”
包括“***/**”
archiveName=“lib.zip”
destinationDir=file(“target/”)
}
//要发布的zip脚本文件
任务ZipScript(类型:Zip){
来自“脚本”
变成“脚本”
包括“***/**”
archiveName=“scripts.zip”
destinationDir=file(“target/”)
}
//创建所有三个jar以供发布
任务发布(){
德彭森·法特贾尔
德彭森·巴雷贾尔
德彭森灯塔酒店
dependsOn任务[“zipLibs”]
dependsOn任务[“zipscript”]
//必要,因为dependsOn未定义订单
bareJar.mustRunAfter类
//slimJar.mustRunAfter bareJar
lightJar.mustRunAfter slimJar
fatJar.mustRunAfter lightJar
}
//清理目标目录
先打扫卫生{
文件(“.gradle”).deleteDir()
文件(“目标”).deleteDir()
}
//如果不存在,请下载bigg.sqlite
任务设置数据库{
gradle.taskGraph.whenReady{graph->
如果(!project.file(“resources/edu/ucsd/sbrg/bigg/bigg.sqlite”).存在()
&&(graph.hasTask(slimJar)| graph.hasTask(fatJar))){
doFirst{
执行官{
println“设置数据库”
命令行“/scripts/configureSQLiteDB.sh”
}
}
}
}
}
//travis.yml中的bump jar版本
如果(project.file(“.travis.yml”).exists()){
task bumpVersionTravis(){
替换版本(“travis.yml”)
}
processResources.dependsOn bumpVersionTravis
}
//ModelPolisher.sh中的bump jar版本
如果(project.file(“./scripts/ModelPolisher.sh”).exists()){
task bumpVersionMP(){
替换版本(“./scripts/ModelPolisher.sh”)
}
processResources.dependsOn bumpVersionMP
}
def替换版本(路径){
ArrayList内容=新建ArrayList()
File travisFile=新文件(路径)
字符串MPVersion=/ModelPolisher.*\d{1,2}(.\d{1,2}){1,2}.jar/
travisFile.eachLine{
行->
content.add(line.replaceAll)(MPVersion,“ModelPolisher fat-”+
“${version}.jar”))
}
BufferedWriter writer=new BufferedWriter(new FileWriter(travisFile))
内容{
行->writer.writeLine(行)
}
writer.close()
}
您似乎对gradle配置有错误的想法。您不应该根据输入更改任务行为。您应该配置任务之间的依赖关系,并配置任务输入/输出以控制“最新”行为
例如:
以下也是不好的做法
if (project.file(".travis.yml").exists()) {
task bumpVersionTravis() {
replaceVersion(".travis.yml")
}
processResources.dependsOn bumpVersionTravis
}
不应根据文件系统中的文件更改可用任务。无论您的文件系统如何,它们都应该始终存在。相反,您应该设置“enabled”标志(或使用任务输出)来控制任务是否执行或被跳过
例如:
if (project.file(".travis.yml").exists()) {
task bumpVersionTravis() {
replaceVersion(".travis.yml")
}
processResources.dependsOn bumpVersionTravis
}
task bumpVersionTravis {
enabled = project.file(".travis.yml").exists()
doLast {
replaceVersion(".travis.yml")
}
}
processResources.dependsOn bumpVersionTravis