[英]MSBuild project file: Copy item to specific location in output directory
[英]MSBuild - Copy file to output directory if the file isn't in the output directory
我有一個帶有 .targets 文件的 nuget,它告訴消費項目將“依賴項”文件夾中的所有文件復制到 output 目錄。
<ItemGroup>
<Files Include="$(MSBuildThisFileDirectory)/../contentFiles/Dependencies/*.*" />
</ItemGroup>
<Target Name="CopyDependencies" AfterTargets="Build">
<Copy SourceFiles="@(Files)"
DestinationFolder="$(TargetDir)" />
</Target>
這個 nuget 由兩個項目使用: Project A
和Project B
對於這個問題,假設我們有一個System.Runtime.InteropServices.RuntimeInformation.dll
,它是這個 nuget 中的依賴項之一。項目 A 的 output 目錄還沒有System.Runtime.InteropServices.RuntimeInformation.dll
,所以它在構建項目時被復制到 output 目錄。 但是,項目 B 已經在 output 目錄中包含System.Runtime.InteropServices.RuntimeInformation.dll
。 這會導致啟動時出現運行時問題,因為目標文件試圖用 nuget 中的System.Runtime.InteropServices.RuntimeInformation.dll
文件覆蓋同名的現有 DLL(這是 output 目錄中其他文件的依賴項) ).
那么,我如何調整 my.targets 文件以僅根據名稱復制 output 目錄中尚不存在的文件,而不是大小或修改日期?
有幾種方法,但對您的示例代碼最簡潔的更改可能如下所示:
<ItemGroup>
<Files Include="$(MSBuildThisFileDirectory)/../contentFiles/Dependencies/*.*" />
</ItemGroup>
<Target Name="CopyDependencies" AfterTargets="Build">
<Copy SourceFiles="@(Files)" DestinationFolder="$(TargetDir)" Condition="!Exists('$(TargetDir)/%(Filename)%(Extension)')" />
</Target>
更改是在Copy
上添加一個Condition
,該條件使用@(Files)
集合的元數據來測試$(TargetDir)
中不存在該文件。
由於使用了元數據, Copy
是一個任務批處理。 本質上, @(Files)
集合按%(Filename)%(Extension)
分為多個批次,每個批次調用一個單獨的Copy
任務。
如果Dependencies
文件夾中有大量文件,以下變體可能會提供更好的性能。
<ItemGroup>
<Files Include="$(MSBuildThisFileDirectory)/../contentFiles/Dependencies/*.*" />
</ItemGroup>
<Target Name="CopyDependencies" AfterTargets="Build">
<ItemGroup>
<FilesToCopy Include="@(Files)" Condition="!Exists('$(TargetDir)/%(Filename)%(Extension)')" />
</ItemGroup>
<Copy SourceFiles="@(FilesToCopy)" DestinationFolder="$(TargetDir)" />
</Target>
任務批處理移動到新ItemGroup
集合的定義中,並且為文件集調用一次Copy
任務。 潛在的性能改進是Copy
任務的實現嘗試並行化副本,這在按文件調用時無法做到。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.