java - 如何在构建时在Gradle中运行控制台命令?

标签 java linux windows gradle rust

我目前正在一个项目中,该项目在Rust中具有 native 组件,而在Java组件中具有。主要的构建系统是Gradle,我希望Gradle每次在构建时都调用Rust构建系统(Cargo),以确保存在正确的共享库以供JNI使用,并根据需要重新编译这些库。经过研究,我想到了这一点:

task buildRustDebug(type:Exec){
    workingDir './native'
    commandLine 'cargo', 'build'
}

task buildRustRelease(type:Exec){
    workingDir './native'
    commandLine 'cargo', 'build', '--release'
}

task buildRust(){
    dependsOn 'buildRustDebug'
    dependsOn 'buildRustRelease'
}

build dependsOn 'buildRust'
除最后一行与build任务建立依赖关系外,所有其他方法都工作正常。当出现此行时,当我尝试运行任何任务时会出现以下错误:
Build file '<censored>' line: 23

A problem occurred evaluating root project '<censored>'.
> Could not get unknown property 'dependsOn' for root project '<censored>' of type org.gradle.api.Project.
直到我的主文件中的代码运行之后,build任务才不存在。我该如何完成我想要的?请注意,此代码位于多项目Gradle构建的根项目中。

最佳答案

您对这个问题的评论是正确的。但是只是给您一些背景信息(并可以将问题标记为已解决):
Gradle使用Groovy或Kotlin作为脚本语言。您正在使用Groovy。
当您编写dependsOn 'buildRustDebug'时,您将使用String参数'buildRustDebug'调用一个名为dependsOn的方法。之所以有效,是因为在Groovy中,method parenthesis are optional。因此,它与dependsOn('buildRustDebug')相同。
当您编写build dependsOn 'buildRust'时,在语法上是不正确的。您要使用参数调用dependsOn对象上的build方法。尝试以下方法:

build.dependsOn 'buildRust' // Or
build.dependsOn('buildRust')
注意方法调用之前的点。
另一件事是build是依赖关系树中的“最外部”任务之一,它本身依赖于其他任务,例如compileJavatest。如果要在组装或测试应用程序之前确保Rust项目已构建且可用,则可能需要将依赖项稍微向下移动一棵树。否则,您冒着buildRust任务是它做的最后一件事的风险,而它可能应该是它做的第一件事。

关于java - 如何在构建时在Gradle中运行控制台命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63608261/

相关文章:

windows - 为什么不加载符号进行调试?

windows - 使用 32 位安装程序删除 64 位注册表项

Java正则表达式从ascii文本中识别3列表

java - 字符串文字作为方法的参数

linux - 终端 I/O(如何使用特定内存区域模拟终端读/写?)

c - 打开不带扩展名的文件

python - 如何在 Windows 中设置 LANG 变量?

java - 使用 Jacoco 对使用 Powermock 编写的测试类进行单元测试覆盖

java - java中的超时锁

linux - "arm-linux-gcc"和 "sim-panalyzer"导致的奇怪错误位于glibc函数 "dl_aux_init"