簡體   English   中英

MSBuild - 如果文件不在 output 目錄中,則將文件復制到 output 目錄

[英]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 AProject 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM