2014-05-08 34 views
16

我的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插件。

回答

33

一个常见的陷阱。将任务添加到任务中,否则代码将在配置阶段运行。样品的任务与行动:

task sample << { 
} 

当我看到你宁愿需要编写自定义任务比使用Exec类型。我认为将commandLine定义两次是无效的。

+0

精确。我知道'''快捷方式,但是文档没有在配置阶段明确表现出这种行为。 –

+0

好吧,好的。你知道如何配置它吗?如果不能随意提出进一步的问题。 – Opal

+0

是的,谢谢。 :) –

10

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


task task1 { 
    doLast { 
    code 
    } 
} 

commandLine的简写是Exec Task的一部分,但你的其他代码是不是和应包装成doLast这将首先执行命令行,然后执行你的额外的代码。如果你需要另一个exec 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') 
    } 
} 
1

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

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