Dot-Net

從 MSBuild 項目中獲取輸出文件

  • December 10, 2012

是否可以從 MSBuild 項目中獲取所有輸出文件的列表?

在一個簡單的項目中,我可以做類似的事情

<CreateItem Include="$(OutputDir)**\*">
     <Output ItemName="AllOutputs" TaskParameter="Include"/>
</CreateItem>

但我的項目是更大建構的一部分,所有輸出都到一個公共位置,我希望能夠排除不屬於的 dll 和內容。

有任何想法嗎?

再次查看您的評論後,我意識到我誤解了您真正需要的內容。這是你手頭上的一個有趣的問題。

如果您不介意編輯項目文件本身,您可能會非常接近您想要的。有一個FileWrites項可以跟踪在建構過程中寫出的所有文件。要開始使用此編輯項目文件以具有此AfterBuild目標

<Target Name="AfterBuild">
 <Message Text="FileWrites: @(FileWrites)" Importance="high"/>
</Target>

這種方法也存在一些問題

  • 您必須編輯項目文件本身
  • 這將包含寫入中間輸出目錄(即obj)和輸出目錄(即bin)的文件
  • 如果有建構自定義,則不需要寫入此項目

您可能認為可以使用MSBuild 解決第一個問題:Find Many Project References技術並在建構後輸出 FileWrites 項。這僅在包裝器 proj 文件與原始項目本身放置在同一文件夾中時才有效,因為 .csproj 文件中的所有項目都使用相對路徑聲明。所以大部分都是這樣。

您可以通過使用 FindUnderPath 任務來克服第二個限制,僅獲取放置在OutputPath文件夾中的文件。

您可以做但也不是很可靠的方法是在建構開始時檢查 OutputPath,然後在建構結束時再次檢查添加了什麼。假設您將原始文件放入項目 StartFiles 並在建構結束時將所有文件放入名為 EndFiles 的項目中,您可以這樣做:

<Target Name="SomeTargetHere">

<ItemGroup>
   <FilesWritten Include="@(EndFiles)" />
   <FilesWritten Remove="@(StartFiles)"/>
</ItemGroup>

<!-- Now FilesWritten contains the difference between EndFiles & StartFiles -->

</Target>

簡而言之,我不確定是否有一個不涉及自定義任務或自定義記錄器的好的解決方案:(。

賽義德·易卜拉欣·雜湊米

我的書:Microsoft Build Engine 內部:使用 MSBuild 和 Team Foundation Build

引用自:https://stackoverflow.com/questions/1050110