2017-01-08 24 views
1

這與Android以及我可以谷歌出來的「gradle sync command」無關。沒有任務的Gradle同步

我想同步幾個目錄。什麼工作是

task mysync1 { 
    dependsOn dep1, dep2, ... 
    from "src1" 
    into "dst1" 
} 
task mysync2 { 
    dependsOn dep1, dep2, ... 
    from "src2" 
    into "dst2" 
} 
... 
task mysync { 
    depends on mysync1, mysync2, .... 
} 

但我討厭創建任務,我永遠也不會手動調用(特別是ES IT雜波gradle tasks輸出)。所以,我想

task mysync { 
    dependsOn dep1, dep2, ... 
    doLast { 
     sync { 
      from "src1" 
      into "dst1" 
     } 
     sync { 
      from "src2" 
      into "dst2" 
     } 
     ... 
    } 
} 

,但我得到的錯誤

Could not find method from() for arguments [src1] on task ':mysync'. 

有沒有解決方案?這是一個壞主意嗎?

它是如何與它合作copy

如何找出sync區塊內允許的內容(我只能找到Sync任務)?

+1

Project中有一個copy()方法。沒有方法sync()。 https://docs.gradle.org/current/dsl/org.gradle.api.Project.html#org.gradle.api.Project:copy(groovy.lang.Closure) –

+0

@JBNizet這解釋了爲什麼我找不到文檔。 :D但是,那麼'sync {...}'做了什麼? – maaartinus

+0

不幸的是,這就是我對groovy魔法的理解停止的地方。我只能說,用blabla替換它會讓gradle抱怨失蹤的blabla方法。但是我找不到任何地方記錄的同步方法。 –

回答

0

它是如何與copy一起使用的?

它的工作原理,因爲copy是在評論中提到JB NizetProject的方法。

有沒有解決方法?

是的,有一個解決方案使用任務Sync,因爲沒有方法稱爲sync

task megasync() { 
    dependsOn dep1,dep2.... 
    ['src1':'dest1','src2':'dest2',...].each{ 
    src,dest-> 
    task sync(type:Sync,overwrite:true){ 
     from src 
     into dest 
    } 
    sync.execute() 
    } 
} 

另一種解決方案是創建一個方法調用,同步執行Sync任務(再次,overwrite必須設置爲true)。

此外,如果您想爲每個同步操作使用preserve屬性,則表示方式列表中需要一些解決方法。也許因爲,['src1':['dest1','preserve_variables..'],'src2':...]

如何找出同步塊內允許的內容? 我試圖執行以下任務:

task test{ 
    sync{ 
     print "Testing" // This executes, but NPE is raised for `sync` on 
         // some other default sync methods 
    } 
} 

我看着堆棧跟蹤,我發現syncFileOperations.java的方法,它有一個返回值。也許,這就是執行print的原因,並且不會引發錯誤Could not find method sync()而是因爲沒有返回有效對象而引發NPE