如何从命令行向gradle询问属性的值?
例如,如果我希望一个shell脚本能够获取如何从命令行向gradle询问属性的值?,gradle,Gradle,例如,如果我希望一个shell脚本能够获取rootProject.name的值,我该怎么做呢?理想情况下,我希望使用一些参数集调用/gradlew,并让它将属性值(而不是其他内容)打印到stdout。为了清晰起见,下面是我的Gradle包装器版本: $ ./gradlew --version ------------------------------------------------------------ Gradle 5.4.1 ----------------------------
rootProject.name
的值,我该怎么做呢?理想情况下,我希望使用一些参数集调用/gradlew
,并让它将属性值(而不是其他内容)打印到stdout。为了清晰起见,下面是我的Gradle包装器版本:
$ ./gradlew --version
------------------------------------------------------------
Gradle 5.4.1
------------------------------------------------------------
Build time: 2019-04-26 08:14:42 UTC
Revision: 261d171646b36a6a28d5a19a69676cd098a4c19d
Kotlin: 1.3.21
Groovy: 2.5.4
Ant: Apache Ant(TM) version 1.9.13 compiled on July 10 2018
JVM: 11.0.2 (Oracle Corporation 11.0.2+9-LTS)
OS: Mac OS X 10.14.4 x86_64
这是一项现有任务,旨在让您了解可用的属性:
$ ./gradlew properties
> Task :properties
------------------------------------------------------------
Root project
------------------------------------------------------------
allprojects: [root project 'myProject', project ':otherProject', ...]
...
rootDir: /path/to/rootDir
rootProject: root project 'myProject'
...
version: 2.3.0
...
这是我为打印项目属性而构建的自定义任务
class ResolveProperties extends DefaultTask {
@Input
String prop
ResolveProperties() {
// if no --prop=<property> is provided, default to spitting out all properties
prop = "properties"
}
@Option(option = 'prop', description = 'Set the property to be evaluated for the project.')
void setProp(final String prop) {
this.prop = prop
}
@TaskAction
void resolveProp() {
List<String> propPath = this.prop.tokenize('.')
int n = propPath.size()
def currentProp = project
propPath.eachWithIndex { p, i ->
if(currentProp.hasProperty(p)) {
currentProp = currentProp.property(p)
}
else {
throw new GradleException("failed to resolve property: ${this.prop}")
}
}
println "${this.prop} -> ${currentProp}"
}
}
task resolveProperties(type: ResolveProperties)
因为我们在找不到属性时抛出了一个GradleException
,所以在Bash中,您可以检查命令的返回代码以知道何时解析出值。成功输出的格式取决于您,您可以轻松解析它
$ ./gradlew -q resolveProperties --prop=does.not.exist
resolveProperties took 0 seconds
FAILURE: Build failed with an exception.
* Where:
Build file '/Users/elliott/Documents/GitHub/onestop/build.gradle' line: 259
* What went wrong:
Execution failed for task ':resolveProperties'.
> failed to resolve property: does.not.exist
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Get more help at https://help.gradle.org
BUILD FAILED in 0s
如果出现类似上面的故障,我们在Bash中得到一个非零返回代码,我们知道不需要尝试解析该值:
$ echo $?
1
不幸的是,我不知道在Gradle中有什么简单的方法可以只将您关心的值提供给stdout(防止一些解析),但这可以让您在大部分方面都有一定的灵活性。如果它仍然相关的话 可能的解决方案A:在cmd行上打印“rootProject.name”的值 在build.gradle中添加任务:
/**
*将属性“rootProject.name”的值打印到标准输出。
*
*用法:./gradlew-q printRootProjectName
*/
任务printRootProjectName{
多拉斯特{
println(project.findProperty('rootProject').name)
}
}
很遗憾,您的解决方案A不起作用。试试这个文件:plugins{id'java'}任务printRootProjectName{doLast{println(project.findProperty('rootProject').name)}构建{println'hi'}
这能回答你的问题吗?
$ echo $?
1