【发布时间】:2021-01-30 11:56:28
【问题描述】:
我创建了this repo 来准确再现我所看到的。我有一个正在使用 Gradle 构建的项目。我想配置我的 Gradle 构建以便运行:
./gradlew build
和跑步的效果完全一样:
./gradlew clean build scalafmt shadowJar fizzbuzz
意思是 Gradle 按以下顺序调用任务:
clean-
build(编译和运行单元测试) -
scalafmt(运行将我的代码格式化为样式指南的工具) -
shadowJar(创建一个独立的可执行“胖”jar) -
fizzbuzz(将“Fizzbuzz!”打印到控制台)
根据Gradle docs on ordering tasks,看来我可以使用shouldRunAfter 来指定所有任务的排序...
如果你在上面克隆我的 repo,然后运行 ./gradlew build,你会得到以下输出:
./gradlew build
Fizzbuzz!
FAILURE: Build failed with an exception.
* Where:
Build file '/Users/myUser/thelab/idea-scala-hate-each-other/build.gradle' line: 65
* What went wrong:
A problem occurred evaluating root project 'idea-scala-hate-each-other'.
> Could not find method shouldRunAfter() for arguments [task ':build'] on cz.alenkacz.gradle.scalafmt.PluginExtension_Decorated@6b24ddd7.
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
Total time: 10.983 secs
所以即使我指定 fizzbuzz 最后运行...它首先运行!我的其余配置存在(显然)错误。而且我不确定如何“挂钩”clean,这样即使我运行./gradlew build,它也会首先运行clean。
我可以接受一个解决方案,该解决方案需要我编写自己的“包装器任务”来实现我想要的顺序,然后调用它,比如通过./gradlew buildMyApp 等。只是不确定如何完成我要。
更新
我对@987654338@ 做了一些更改,现在看到了:
./gradlew fullBuild
:compileJava UP-TO-DATE
:compileScala
:processResources UP-TO-DATE
:classes
:jar
:startScripts
:distTar
:distZip
:assemble
:compileTestJava UP-TO-DATE
:compileTestScala UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:build
:clean
:fizzbuzz
Fizzbuzz!
:scalafmt
:shadowJar
:fullBuild
所以当我运行./gradlew fullBuild时,任务执行似乎是:
-
build(通过check调用compileJava) cleanfizzbuzzscalafmtshadowJar
所以即使考虑到我最近的更改,排序仍然是错误的......
【问题讨论】:
-
您需要将 println 包装在 doFirst/doLast 块中。
-
感谢@OliverCharlesworth (+1) - 对异常有任何想法吗?
标签: gradle