2014-04-11 138 views
0

我想寫一個任務規則來創建一系列檢查各種svn存儲庫位置的任務。這是我的原則:無法創建一個執行任務的Gradle任務規則


tasks.addRule("Pattern: svnCheckout&ltClassifier> - Checks out the indicated svn repo") { String taskName -> 
    if(taskName.startsWith('svnCheckout')) { 
    task(name: taskName, type: Exec) { 
     String classifier = taskName - 'svnCheckout' 
     String svnDir = svnRepoUrl //defined elsewhere 
     switch(classifier) { 
     case 'SourceTrunk': 
      svnDir += 'branches/CleanBuild/trunk' 
      break 
     case 'AutoInstaller': 
      svnDir += 'Tools/AutoInstaller' 
      break 
     case 'ContentAutomation': 
      svnDir += 'Tools/ContentAutomation' 
      break 
     case 'InternalTools': 
      svnDir += 'Tools/Internal' 
      break 
     default: 
      throw new GradleException("Invalid svnCheckout classifier '$classifier'") 
     } 

     String svnCommand = "svn co $svnDir --trust-server-cert" 

     //commandLine 'cmd', '/c', "$svnCommand" 
     commandLine 'cmd', '/c/', "echo 'Task created'" 
     workingDir = "$workspace" 
    } 
    } 
} 

然後我嘗試用這個命令運行的任務 'svnCheckoutSourceTrunk':

gradlew -Pworkspace="." svnCheckoutSourceTrunk

其失敗,出現錯誤


FAILURE: Could not determine which tasks to execute. 

* What went wrong: 
Task 'svnCheckoutSourceTrunk' not found in root project 'GradleScripts'. 

* Try: 
Run gradlew tasks to get a list of available tasks. 

BUILD FAILED 

任何人看到什麼我做錯了?我在前幾行放了一些println聲明,並且執行已經越過了if語句,但它並沒有進入任務聲明。

回答

1

用於聲明任務的語法不正確。 (不知道爲什麼它不給了一個錯誤。)第一個位置參數總是需要的任務名稱:

task(taskName, type: Exec) { ... } 

在構建腳本,這也將工作:

task "$taskName"(type: Exec) { ... } 
+0

謝謝。但是,這似乎很奇怪,但這是一個問題。作爲第一個參數的'name:taskName'不會在功能上等同嗎?那裏發生了什麼? – Max

+0

「功能等同」是什麼意思? 「Project#task」方法的所有重載都有一個String作爲它們的第一個位置參數。正如我所說,我不知道爲什麼你的語法不會給出錯誤,這就是爲什麼我提出http://issues.gradle.org/browse/GRADLE-3065。 –

+0

啊,我把它與task.create()的重載混淆了。沒關係。 – Max

相關問題