简体   繁体   English

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

[英]How can I ask gradle for the value of a property from the command line?

For example, if I wanted a shell script to be able to get the value of rootProject.name , how could I do this?例如,如果我希望 shell 脚本能够获取rootProject.name的值,我该怎么做? Ideally, I'd like to invoke ./gradlew with some set of arguments and have it print the property value (and nothing else) to stdout.理想情况下,我想用一些参数集调用./gradlew并让它将属性值(而不是其他任何东西)打印到标准输出。

For clarity, here is my Gradle wrapper version: 为了清楚起见,这是我的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

This is an existing task to give you an idea of the properties available: 这是一项现有任务,可让您大致了解可用的属性:

$ ./gradlew properties


> Task :properties

------------------------------------------------------------
Root project
------------------------------------------------------------

allprojects: [root project 'myProject', project ':otherProject', ...]
...
rootDir: /path/to/rootDir
rootProject: root project 'myProject'
...
version: 2.3.0
...

Here is a custom task I've built to print out a project property 这是我为打印项目属性而构建的自定义任务

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)

And this is how I use my custom task with a --prop parameter (indicated by @Option(option = 'prop' . I'm using the -q (quiet) Gradle option to suppress some of the extra output. 这就是我如何将自定义任务与--prop参数一起使用(由@Option(option = 'prop' 。),我正在使用-q (quiet)Gradle选项抑制一些额外的输出。

$ ./gradlew -q resolveProperties --prop=rootProject.name
rootProject.name -> onestop
resolveProperties took 0 seconds
$ ./gradlew -q resolveProperties --prop=rootProject.version
rootProject.version -> 2.3.0
resolveProperties took 0 seconds
$ ./gradlew -q resolveProperties --prop=rootProject.group
rootProject.group -> org.cedar.onestop
resolveProperties took 0 seconds

Because we are throwing a GradleException when we can't find the property, in Bash you can check the return code of the command to know when to parse out the value. 由于找不到属性时会GradleException ,因此在Bash中,您可以检查命令的返回码以了解何时解析该值。 The formatting of a successful output is up to you and you could make it easily parsed. 成功输出的格式取决于您,您可以轻松对其进行解析。

$ ./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

In case of a failure like the one above, we get a non-zero return code in Bash, and we know we don't need to try and parse out the value: 如果发生上述失败,我们将在Bash中获得非零的返回码,并且我们知道我们无需尝试解析出该值:

$ echo $?
1

Unfortunately, I don't know a simple way in Gradle to only give the value you are concerned with to stdout (prevent some parsing), but this gets you most of the way there with some flexibility. 不幸的是,我不知道Gradle中是否有一种简单的方法可以将您关心的值提供给stdout (防止进行某些解析),但这可以使您获得大部分灵活性。

If it is still relevant ...如果它仍然相关...

Possible Solution A: print value of " rootProject.name " on cmd line可能的解决方案 A:在 cmd 行打印“ rootProject.name ”的值

Add task in build.gradle:在 build.gradle 中添加任务:

 /** * Prints value of property "rootProject.name" to stdout. * * Usage: ./gradlew -q printRootProjectName */ task printRootProjectName { doLast { println(project.findProperty('rootProject').name) } }

Possible Solution B: print a property value as provided on cmd line可能的解决方案 B:打印 cmd 行上提供的属性值

Add task in build.gradle:在 build.gradle 中添加任务:

 /** * Print value of property provided in "-Pprop" on command line to stdout. * * Usage Example: ./gradlew -q printProperty -Pprop=rootProject.name */ task printProperty { doLast { // get the "property name" in question from commandline: String prop = project.findProperty('prop') if (prop == null) { return // or use println ... } // treat as property name: Object theProperty = project.findProperty(prop) if (null == theProperty) { // try to handle provided information as "nested property" List < String > thePropPath = prop.split('\\\\.').toList() theProperty = project.findProperty(thePropPath.head()) // aux. closure to travel "property path" def pp = { s, t - > if (s != null && s.hasProperty(t).is(true)) { return s.property(t) } return null } thePropPath.tail().each { item - > theProperty = pp(theProperty, item) } } println(theProperty ? : "") // or print "null" ... } }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM