Gradle任务不应自动执行

时间:2014-05-08 15:35:58

标签: gradle android-gradle

我在gradle中定义任务:

task releaseCandidate(type: Exec) {
    commandLine 'git', 'checkout', 'develop'

    // Increment version code in Manifest
    String manifest = new File('AndroidManifest.xml').getText('UTF-8')
    Pattern pattern = Pattern.compile('android:versionCode="([0-9]+)"')
    Matcher matcher = pattern.matcher(manifest)
    matcher.find()
    int newVersionCode = Integer.parseInt(matcher.group(1)) + 1
    manifest = manifest.replaceAll(
        "android:versionCode=\"([0-9]+)\"", "android:versionCode=\"$newVersionCode\""
    )
    new File('AndroidManifest.xml').write(manifest, 'UTF-8')

    commandLine 'git', 'diff'
}

我只有在明确地将其称为gradle releaseCandidate时才会执行。 但是,当我运行任何其他任务时,例如gradle assembleDebug,它还会运行任务releaseCandidate。我不希望这种行为发生。没有任务取决于releaseCandidate,反之亦然。

我的项目是Android应用,所以我使用的是android gradle插件。

3 个答案:

答案 0 :(得分:50)

一个常见的陷阱。向任务添加操作,否则代码将在配置阶段运行。采取行动的示例任务:

task sample << {
}

我认为您需要编写自定义任务而不是使用Exec类型。我认为两次定义commandLine无效。

修改

您可以阅读this帖子,了解一切是如何运作的。

答案 1 :(得分:16)

您正在混合任务配置和常规代码。作为任务定义主体一部分的所有内容都将在配置阶段执行。 task task1 << { code }

的简写

task task1 {
  doLast {
    code
  }
}

commandLineExec Task的一部分,但您的其他代码不是并且应该包含在doLast中,这将首先执行命令行,然后执行您的其他代码。如果您需要另一位执行官commandLine,那么您将需要另一项任务。


task releaseCandidate(type: Exec) {
    commandLine 'git', 'checkout', 'develop'

    doLast {
    // Increment version code in Manifest
    String manifest = new File('AndroidManifest.xml').getText('UTF-8')
    Pattern pattern = Pattern.compile('android:versionCode="([0-9]+)"')
    Matcher matcher = pattern.matcher(manifest)
    matcher.find()
    int newVersionCode = Integer.parseInt(matcher.group(1)) + 1
    manifest = manifest.replaceAll(
        "android:versionCode=\"([0-9]+)\"", "android:versionCode=\"$newVersionCode\""
    )
    new File('AndroidManifest.xml').write(manifest, 'UTF-8')
    }
}

答案 2 :(得分:1)

只是在真正使用 Exec 的情况下完成@Opal答案(例如 CommandLine 参考):

task task1 << {
   exec {
        List<String> arguments = new ArrayList<String>()
        //..
        commandLine arguments
   }
}