如何从命令行向gradle询问属性的值?

如何从命令行向gradle询问属性的值?,gradle,Gradle,例如,如果我希望一个shell脚本能够获取rootProject.name的值,我该怎么做呢?理想情况下,我希望使用一些参数集调用/gradlew,并让它将属性值(而不是其他内容)打印到stdout。为了清晰起见,下面是我的Gradle包装器版本: $ ./gradlew --version ------------------------------------------------------------ Gradle 5.4.1 ----------------------------

例如,如果我希望一个shell脚本能够获取
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