2011-05-10 22 views
4

CopiedFiles參數正在返回所有打算複製的文件。但考慮到SkipUnchangedFiles設置爲true並且ttask本身沒有複製任何可以在命令行中看到的內容(不復制消息)的事實。那爲什麼不呢,CopiedFiles是空的?複製任務的輸出參數'CopiedFiles'正在返回指定要複製的所有文件,即使它沒有給出任何複製SkipUnchangedFiles =「true」

我需要將CopiedFiles參數填充爲僅實際複製的文件(因爲它們已更改)以便將這些文件進一步複製到其他文件夾中。這是爲了保持一個最新版本的文件夾,以及只提取實際需要傳播到UAT /生產服務器上的那些文件。

以供參考,我使用的複製任務的代碼如下:

 
<Copy SkipUnchangedFiles="true" 
      SourceFiles="@(cfile)" 
       DestinationFiles="@(cfile->'$(PublishDir)\%(Identity)')"> 

     <Output 
        TaskParameter="CopiedFiles" 
        ItemName="Changed" /> 

</Copy> 

<Message Text="changed:@(Changed)" Importance="high" /> 

是否有在副本任務中的錯誤或這是預期的行爲。

回答

3

你看到的行爲是設計。 MSBuild使用任務輸出跟蹤文件依賴性。如果不這樣做,那麼依賴於@(Changed)項目數組作爲輸入的任何內容都不會在大多數情況下完全處理它所需的所有文件。它甚至會跟蹤在輸入和輸出最新時甚至不執行的目標中創建的屬性和項目,出於同樣的原因。考慮用一個額外的輸出參數CopiedFilesCopiedByTask(這個命名反映出在其他不存在的CreateProperty任務中的ValueSetByTask的命名和行爲)來製作一個不同的Copy任務。

+3

如果這是有意設計的,那麼爲什麼MSDN與之矛盾。 [複製任務](http://msdn.microsoft.com/en-us/library/3e54c37h.aspx)它說「CopiedFiles:包含已成功複製的項目。」 – 2011-05-10 05:58:33

+1

您說得對,值得一個腳註,它應該說「......或者如果它們不是最新的,它們將被複制,並且由於SkipUnchangedFiles設置爲true而被跳過。」無論SkipUnchangedFiles的值如何,該任務都將在依賴關係分析方面確定性地運行。 – 2011-05-10 14:05:30