2009-06-26 25 views
15

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

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

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

,但我的項目是一個大的構建的一部分,並且所有輸出到一個共同的位置,我希望能夠exculde DLL和內容那不屬於。

任何想法?

回答

23

再次看到您的評論後,我意識到我誤解了您真正需要的東西。這是你手上有趣的問題。

如果你不介意編輯項目文件本身,你可能會得到漂亮的關閉到你想要的。有一個項目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,要麼在構建和結束時再一次查看添加的內容。比方說,你把原來的文件到一個項目的開始文件,並在構建結束把所有的文件放到一個名爲項EndFiles你可以在做:

<Target Name="SomeTargetHere"> 

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

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

</Target> 

總之我不知道是否有一個很好的解決方案,不涉及任何自定義任務或自定義記錄儀:(

賽義德·易卜拉欣·哈希米

的My Book:Inside the Microsoft Build Engine : Using MSBuild and Team Foundation Build

+0

感謝您的詳細解答。 – 2009-07-07 13:20:09

11

如果您使用的是MSBuild task,那麼您可以獲取使用TargetOutputs輸出生成的文件。這是所以當YourProject.csproj是建立了創建將被放置在YourProjectOutputs項目裏面的文件該情況的一個例子

<MSBuild Projects="YourProject.csproj"> 
     <Output ItemName="YourProjectOutputs" TaskParameter="TargetOutputs"/> 
</MSBuild> 

前段時間我創建了一個博客條目,詳細介紹了這個,MSBuild: How to Get All Generated Outputs

賽義德·易卜拉欣·哈希米

的My Book:Inside the Microsoft Build Engine : Using MSBuild and Team Foundation Build

+0

感謝您的建議,問題是TargetOutputs只包含輸出程序集,並且GetOutputs任務包括輸出目錄中的所有內容,即使msbuild項目未創建/複製它。 – 2009-06-30 14:36:23

3

看看我以前的博客條目MSBuild: Find Many Project References。在那篇文章中,我將描述如何創建一個可以提取Reference ItemGroup的值的MSBuild文件。在你的情況下,只需將我創建的目標替換爲從OutputPath中找到的所有文件填充項目的目標。讓我知道你是否希望我擴大這一點。

0

我們做什麼戰鬥是這種情景每個版本創建「部署」主任Ÿ(你可以稱它爲你想要的)。

部署目錄僅包含實際應用程序所需的可執行文件和dll(即,測試dll不會放在那裏)。每個項目都需要將其「可部署」的東西放到該目錄中(我們甚至添加子目錄(即Web,服務等)。)

它重複了一些位,但它可以讓你訪問所有的dll如果需要,建立。

+0

我想有一個共同的「部署」目錄,但能夠確定哪些文件是由每個項目創建的 – 2009-07-07 13:19:37