2013-12-22 70 views
2

我編寫了一個自定義gradle插件,我想從類路徑中的jar中將特定文件複製到buildDir。我在沙箱中的項目發揮各地,並得到了這個解決方案的工作:從自定義gradle插件中的jar複製文件

task copyFile(type: Copy) { 
      from zipTree(project.configurations.compile.filter{it.name.startsWith('spring-webmvc')}.singleFile) 
      include "overview.html" 
      into project.buildDir 
     } 

,但如果將其複製到我的插件:

project.task(type: Copy, "copyFile") { 
      from zipTree(project.configurations.compile.filter{it.name.startsWith('spring-webmvc')}.singleFile) 
      include "overview.html" 
      into project.buildDir 
     } 

我得到了錯誤:

* What went wrong: 
A problem occurred evaluating root project 'gradle-springdoc-plugin-test'. 
> Could not find method zipTree() for arguments [/Users/blackhacker/.gradle/caches/artifacts-26/filestore/org.springframework/spring-webmvc/4.0.0.RELEASE/jar/a82202c4d09d684a8d52ade479c0e508d904700b/spring-webmvc-4.0.0.RELEASE.jar] on task ':copyFile'. 

的結果

println project.configurations.compile.filter{it.name.startsWith('spring-webmvc')}.singleFile.class 

class java.io.File 

我在做什麼錯了?

回答

4

與構建腳本不同,插件沒有隱含的project上下文(除非你給它一個)。因此,你將不得不使用project.task而非taskproject.zipTree而不是zipTreeproject.file而不是file

PS:在你的情況下,使用project.zipTree { ... }(注意大括號)推遲搜索的是非常重要的文件直到Zip內容被實際請求。否則,您可能會減慢每個構建調用的速度(即使從未執行過copyFile),並且如果該文件是由相同構建生成的,甚至構建失敗(因爲在添加文件之前解析配置)。

+0

Thx Peter!似乎你是gradle問題的一站式資源:-)我在這裏添加了一個'''project.afterEvaluate''''塊,否則我得到'''你不能改變一個不處於未解析狀態的配置! '''消息。 – thilko

+0

這應該沒有必要。聽起來像你沒有使用大括號。 –

+0

是的,你是對的! – thilko

相關問題