【问题标题】:Why does accessing a Groovy process's getText() twice cause a failure?为什么访问 Groovy 进程的 getText() 两次会导致失败?
【发布时间】:2016-05-14 13:01:24
【问题描述】:

我正在运行一些带有 Gradle 任务的 curl 代码,我注意到如果我访问该进程的文本两次,那么第二次访问总是失败。我注意到通过将 process.text 传递给 XlmSlurper()。如果我首先 printlned process.text 它会在 slurped 时崩溃,如果我没有 println 它然后 slurped 工作。 这是一些说明这种行为的代码。首先是失败的任务版本:

    task hello {
        println "****** HELLO ******"

        def process = ['curl', '-X', 'POST', '-H', 'Accept: Application/xml', '-H', 'Content-Type: application/json', "http://itemid.sea.redacted.com/item_ids", '-d', '{"user":"Y2VxYnVpbGRhZ2VudDpCdTFsZCE=","request":"guid"}'].execute()
        process.waitFor()

        println "err.text"
        println process.err.text

        println "process.text 1 is:"
        println process.text

        println "process.text 2 is:"
        println process.text
    }

执行此操作时,输出为:

****** HELLO ******
err.text
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   141    0    85  100    56   2412   1589 --:--:-- --:--:-- --:--:--  2428

process.text 1 is:
<?xml version="1.0" encoding="utf-8"?><long xmlns="http://redacted.com/">121144</long>
process.text 2 is:
Failed to notify ProjectEvaluationListener.afterEvaluate(), but primary configuration failure takes precedence.
java.lang.IllegalArgumentException: android.compileSdkVersion is missing!
    at com.android.build.gradle.internal.SdkHandler.initTarget(SdkHandler.java:80)
    at com.android.build.gradle.BasePlugin.ensureTargetSetup(BasePlugin.groovy:462)

但是如果最后两行println被注释掉就成功了:

    task hello {
        println "****** HELLO ******"

        def process = ['curl', '-X', 'POST', '-H', 'Accept: Application/xml', '-H', 'Content-Type: application/json', "http://itemid.sea.redacted.com/item_ids", '-d', '{"user":"Y2VxYnVpbGRhZ2VudDpCdTFsZCE=","request":"guid"}'].execute()
        process.waitFor()

        println "err.text"
        println process.err.text

        println "process.text 1 is:"
        println process.text

      //  println "process.text 2 is:"
      //  println process.text
    }

哪个有输出:

****** HELLO ******
err.text
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   141    0    85  100    56   1977   1303 --:--:-- --:--:-- --:--:--  2023

process.text 1 is:
<?xml version="1.0" encoding="utf-8"?><long xmlns="http://redacted.com/">121145</long>
:help

Welcome to Gradle 2.2.1.

To run a build, run gradlew <task> ...

To see a list of available tasks, run gradlew tasks

To see a list of command-line options, run gradlew --help

BUILD SUCCESSFUL

为什么添加/删除那些最后的 println 会导致这样的差异?

(还有为什么第二个版本的输出中有 :help ...?)

在这两种情况下,我都使用 ./gradlew 从命令行运行

如果用getText()代替text/也是同样的问题

【问题讨论】:

    标签: groovy gradle android-gradle-plugin


    【解决方案1】:

    您将得到一个只能读取一次的流。将其写入文件或变量,然后从该文件/变量中读取任意次数。

    【讨论】:

      【解决方案2】:

      这个函数的文档说:

      public static String getText(Process self) 抛出 IOException

      读取Process的输出流的文本。关闭所有 检索文本后与进程关联的流。

      读取标准输出直到 EOF,然后作为字符串返回。该值未缓存,第二次调用到达关闭的流,并失败。

      此外,在 groovy 中,process.getText() 等价于 process.text

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-26
        • 1970-01-01
        相关资源
        最近更新 更多