2008-11-03 53 views
3

在MSBuild中,我想調用一個任務,在特定解決方案中提取所有項目中的所有文件,並將這些文件保存在可傳遞給其他人的屬性中任務(處理等)在MSBuild任務中輸出解決方案中的所有文件

我的線沿線的一些思考:

<ParseSolutionFile SolutionFile="$(TheSolutionFile)"> 
    <Output TaskParameter="FilesFound" ItemName="AllFilesInSolution"/> 
</ParseSolutionFile> 

<Message Text="Found $(AllFilesInSolution)" /> 

這將在溶液輸出項目中的所有文件的清單,我可以使用AllFilesInSolution屬性作爲輸入到其他分析任務。這是一個已經存在的任務還是我需要自己構建它?如果我需要自己構建它,應該輸出一個字符串數組還是ITaskItems或其他東西?

回答

2

我不知道任務,但已經有屬性可以保存所有項目。只要看看你的典型項目文件,你會看到他們被添加到哪個集合。

注意屬性內容編譯文件夾 ...任何時候你將文件添加到一個項目,它被放置在主要收藏品之一是這樣的:

<ItemGroup> 
    <Content Include="Default.aspx" /> 
    <Content Include="Web.config" /> 
</ItemGroup> 
<ItemGroup> 
    <Compile Include="Default.aspx.cs"> 
    <SubType>ASPXCodeBehind</SubType> 
    <DependentUpon>Default.aspx</DependentUpon> 
    </Compile> 
    <Compile Include="Default.aspx.designer.cs"> 
    <DependentUpon>Default.aspx</DependentUpon> 
    </Compile> 
</ItemGroup> 
<ItemGroup> 
    <Folder Include="App_Data\" /> 
</ItemGroup> 

然後你可以做這樣的事情,將現有屬性的值放入屬性中(Condition屬性起到過濾器的作用):

<CreateItem Include="@(Content)" Condition="'%(Extension)' == '.aspx'"> 
    <Output TaskParameter="Include" ItemName="ViewsContent" /> 
</CreateItem> 

或者你也可以手動執行它(包括屬性使用現有屬性OutputPath,但它表明inclues所有文件的路徑):

<CreateItem Include="$(OutputPath)\**\*"> 
    <Output TaskParameter="Include" ItemName="OutputFiles" /> 
</CreateItem> 

有在MSDN MSBuild的文檔中更多的細節,我讀的時候我是使用自定義構建任務和非常有用的東西。閱讀CreateItem任務後,您可以從我在此處發佈的內容中瞭解更多信息。接下來很容易。

0

我使用以下解決方案與SSRS項目(不建立在安裝在構建框上的TFS w/o下)。基本上我們要求將RDLs捆綁到一個構建輸出中,這樣我們就可以標記構建版本。

<Target Name="CopyArtifactstoDropLocation"> 
    <CreateItem Include="$(SolutionRoot)\**\*.*"> 
    <Output TaskParameter="Include" ItemName="YourFilesToCopy" /> 
    </CreateItem> 

    <Copy 
    SourceFiles="@(YourFilesToCopy)" 
    DestinationFiles="@(YourFilesToCopy->'$(DropLocation)\$(BuildNumber)\Release\%(RecursiveDir)%(Filename)%(Extension)')" /> 
</Target> 

只需將複製任務的用法替換爲您需要對您的軟件包執行的任何操作即可。當然,這將讓您的解決方案根目錄中的所有內容都得到解決,但是如果您使用TFS,那麼您應該只能使用可構建的工件。

相關問題