2009-04-14 34 views
1

我有以下的任務,這是因爲DestinationFiles和DestionationFolder的組合不工作,但它抓住的是我想做的概念:的MSBuild遞歸複製爲%(ConfigurationToBuild.PlatformToBuild)

<CreateItem Include="$(Destination)\**\*.Generated.*.*"> 
    <Output TaskParameter="Include" ItemName="GeneratedFiles" /> 
</CreateItem> 

<Copy Condition=" '%(ConfigurationToBuild.FlavorToBuild)'=='Debug-All' Or '%(ConfigurationToBuild.FlavorToBuild)'=='Release-WebService' " 
     SourceFiles="@(GeneratedFiles)" 
     DestinationFiles="@(GeneratedFiles-&gt;'%(RecursiveDir)%(Filename)%(Extension)')" 
     DestinationFolder="$(BinariesRoot)\%(ConfigurationToBuild.PlatformToBuild)\%(ConfigurationToBuild.FlavorToBuild)" 
/> 

所以我有一組正在生成的文件(數據,而不是代碼),這些文件需要複製到最終的二進制文件位置。

在此版本中,我一次構建3個配置:全部調試版本,發佈客戶端版本和發佈WebService。原因是保持相同的內部版本號和完全相同的代碼庫,同時讓客戶端和WebService項目「發佈」,然後由安裝項目獲取。

如果我嘗試使用: DestinationFiles =「@(GeneratedFiles- >「$(BinariesRoot)\%(ConfigurationToBuild.PlatformToBuild)\%(ConfigurationToBuild.FlavorToBuild)\%(RecursiveDir)%(文件名)%(分機)')「

MSBuild在%(ConfigurationToBuild.FlavorToBuild)部件上引發錯誤。

回答

0

我找到了解決此問題的方法:即手動複製命令。 所以它不那麼通用,並且在buildlog文件中產生更多的噪聲,但至少它工作正常!

<!-- Copy the updated files to the Binariesroot to have them picked up by the Setups --> 
<CreateItem Include="$(Destination)\**\*.Generated.*.sql"> 
    <Output TaskParameter="Include" ItemName="GeneratedSqlFiles" /> 
</CreateItem> 
<Message Text="[email protected](GeneratedSqlFiles)->RecursiveDir=%(RecursiveDir) Filename=%(Filename)%(Extension)" /> 

<CreateProperty Condition=" '%(ConfigurationToBuild.FlavorToBuild)'=='Debug'" 
       Value="$(BinariesRoot)\%(ConfigurationToBuild.PlatformToBuild)\%(ConfigurationToBuild.FlavorToBuild)" > 
    <Output TaskParameter="Value" PropertyName="RealBinariesRoot" /> 
</CreateProperty> 
<Copy Condition=" '%(ConfigurationToBuild.FlavorToBuild)'=='Debug'" 
     SourceFiles="@(GeneratedSqlFiles)" 
     DestinationFiles="@(GeneratedSqlFiles->'$(RealBinariesRoot)\Deployment\%(RecursiveDir)%(Filename)%(Extension)')" 
/> 
<CreateProperty Condition=" '%(ConfigurationToBuild.FlavorToBuild)'=='WebService'" 
      Value="$(BinariesRoot)\%(ConfigurationToBuild.PlatformToBuild)\%(ConfigurationToBuild.FlavorToBuild)" > 
    <Output TaskParameter="Value" PropertyName="RealBinariesRoot" /> 
</CreateProperty> 
<Copy Condition=" '%(ConfigurationToBuild.FlavorToBuild)'=='WebService'" 
     SourceFiles="@(GeneratedSqlFiles)" 
     DestinationFiles="@(GeneratedSqlFiles->'$(RealBinariesRoot)\Deployment\%(RecursiveDir)%(Filename)%(Extension)')" 
/> 

同時發現,如果你有'。'在CreateItem任務的包含路徑中,RecursiveDir屬性不再被填充。 因此有

'drive:\ somefolder \ subfolder \ Sources \ Generated ***。Generated。*。sql'將提供% (RecursiveDir)元數據。 使用

'驅動器:\ somefolder \的子文件夾\ \源頭\生成*** *生成SQL。',其解析爲相同的路徑如上述將NOT提供%(RecursiveDir)的元數據。 (注意子文件夾和源文件之間的細微'。')

當然(墨菲法則)我們用這個來指定哪個分支需要構建。指向主分支;-)