여러 작업을 실행하는 Gradle 사용자 지정 작업


81

여러 gradle 작업을 하나로 실행하고 싶습니다. 그래서 대신

./gradlew clean build publish

사용자 지정 작업을 갖고 싶습니다.

./gradlew cleanBuildPublish

실행하도록 clean build하고 publish주문한다.

어떻게 가능합니까?

이것은 작동하지 않습니다

task cleanBuildPublish {
    dependsOn 'clean'
    dependsOn 'build'
    dependsOn 'publish'
}

Java 플러그인을 사용하고 있습니까?
Santosh Gokak 2015 년

@SantoshGokak 그래, 난 할
니클라스

답변:


113

미리 정의 된 순서로 일부 작업을 실행해야하는 경우 다음 코드와 같이을 dependsOn설정하는 것뿐만 mustRunAfter아니라이 작업에 대한 속성 도 설정해야 합니다.

task cleanBuildPublish {
    dependsOn 'clean'
    dependsOn 'build'
    dependsOn 'publish'
    tasks.findByName('build').mustRunAfter 'clean'
    tasks.findByName('publish').mustRunAfter 'build'
}

dependsOn작업 실행 순서를 정의하지 않고 하나의 작업이 다른 작업에 종속되도록 만들뿐 아니라 mustRunAfter수행합니다.


그것만으로도 작업을 실행할 수 있습니까?
Niklas

18
이 오류가 얻을Cannot invoke method mustRunAfter() on null object
니클라스

1
더, 당신의 cleanBuildPublish 작업이 빌드 스크립트에 3 개 따라 작업 후 배치해야 하나
Stanislav

1
cleanBuildPublish모든 개별 작업이 정의 된 후에 를 넣어야합니다 . gradle 작업은 위에서 아래로 읽는 것 같습니다. 그건 내 문제를 해결Cannot invoke method mustRunAfter() on null object
baskInEminence

2
끝까지 작업을 기다리지 않습니다 언급 Gradle을하는 것이 중요합니다
MontrealDevOne

96

다음과 같은 작업 기반 클래스를 사용할 수도 있습니다. GradleBuild

여기에서 어떻게 할 수 있습니까? GradleBuild

task cleanBuildPublish(type: GradleBuild) {
     tasks = ['clean', 'build', 'publish']
}

1
그래서 작업이 언급 된 순서대로 실행됩니까?
Mangesh Kadam

1
그것의 kotlin 버전?
Mani

Kotlin 버전은 매우 유사합니다. project.tasks.register작업을 생성하는 데 사용 하기 만하면 됩니다.
tasomaniac 19

8
다음 Gradle을 프로젝트는 특히이 일에 대해 권장 docs.gradle.org/current/userguide/...
알렉스

4

게시 작업이 subProjectName이라는 하위 프로젝트에있는 경우

...
tasks.findByPath(':subProjectName:publish').mustRunAfter 'build'
...

3

cleanBuildPublish가 다른 작업에 의존하도록 아래 방법을 시도하십시오.

build.gradle

task clean{
    println "lets clean"
}

task build {
    println "lets build"
}

task publish {
    println "lets publish"
}

task cleanBuildPublish{
    println 'lets do all'
}


cleanBuildPublish.dependsOn clean
cleanBuildPublish.dependsOn build
cleanBuildPublish.dependsOn publish

산출

$ gradle cleanBuildPublish
lets clean
lets build
lets publish
lets do all
:build UP-TO-DATE
:clean UP-TO-DATE
:publish UP-TO-DATE
:cleanBuildPublish UP-TO-DATE

BUILD SUCCESSFUL

Total time: 2.738 secs

자세한 내용은 https://docs.gradle.org/current/userguide/more_about_tasks.html#addDependencyUsingTask 를 확인 하세요.


1
여전히 그렇지 않습니다. 출력 : pastebin.com/8knNfLEY Gradle 작업 pastebin.com/NaHhdRkA
Niklas

친절하게 당신의 build.gradle 파일 공유
산토 Gokak

프로젝트 : pastebin.com/4uN9Usvd 캘린더 모듈 : pastebin.com/CPzYKNqx Publishing.gradle pastebin.com/XMMQUG4C
Niklas


0

다음은 DependOn과 mustRunAfter를 모두 사용하여 Kotlin 스크립팅으로 수행 한 방법입니다. 다음은 "this"프로젝트에있는 두 작업 (사용자 정의 등록 된 "importUnicodeFiles"작업)과 ": unicode"라는 형제 프로젝트에있는 작업 (사전 정의 된 "run"작업)을 실행하는 예입니다.

tasks.register("rebuildUnicodeFiles") {
    description = "Force the rebuild of the `./src/main/resources/text` data"
    val make = project(":unicode").tasks["run"]
    val copy = tasks["importUnicodeFiles"]
    dependsOn(make)
    dependsOn(copy)
    copy.mustRunAfter(make)
}

Gradle 개발자는 일반적으로이 접근 방식에 대해 조언하고 (강제 주문이 나쁘고 다른 프로젝트에서 작업을 실행하는 것이 나쁘다고 말합니다) 프로젝트간에 결과를 게시하는 방법을 연구하고 있습니다. 참조 : https://docs.gradle.org/current/userguide/cross_project_publications.html


-1

다음은 DependOn과 mustRunAfter를 모두 사용하여 Kotlin 스크립팅으로 수행 한 방법입니다. 다음은 "this"프로젝트에있는 두 작업 (사용자 정의 등록 된 "importUnicodeFiles"작업)과 ": unicode"라는 형제 프로젝트에있는 작업 (사전 정의 된 "run"작업)을 실행하는 예입니다.

tasks.register("rebuildUnicodeFiles") {
    description = "Force the rebuild of the `./src/main/resources/text` data"
    val make = project(":unicode").tasks["run"]
    val copy = tasks["importUnicodeFiles"]
    dependsOn(make)
    dependsOn(copy)
    copy.mustRunAfter(make)
}

-3

defaultTasksbuild.gradle을 추가 해보세요. 예를 들어. defaultTasks 'clean', 'build', 'publish'

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.