2011-05-28 60 views
1

我有幾個自定義的MSBuild項目文件<ProjectReferences>。 我打電話給<MSBuild Projects="@(ProjectReference)" Targets="Build">任務,我可以使用<Output TaskParameter="TargetOutputs" ItemName="OutputAssemblies" />元素獲得所有構建的程序集,並將@(OutputAssemblies)複製到目標目錄。從<MSBuild>返回ReferenceCopyLocalPaths任務

我想能夠從ResolveAssemblyReferences目標獲得@(ReferenceCopyLocalPaths)項目屬性,但我無法弄清楚如何輸出此屬性。

<Target Name="BuildDocumentationForReferencedProjects"> 
    <MSBuild 
    Projects="@(ProjectReference)" 
    Targets="Build" 
    BuildInParallel="true" 
    Properties="DocumentationFile=$(DllDir)\%(FileName).xml" 
    > 
    <Output TaskParameter="TargetOutputs" ItemName="OutputAssemblies" /> 
    </MSBuild> 

    <Copy SourceFiles="@(OutputAssemblies)" DestinationFolder="$(DllDir)" /> 
</Target> 

回答

6

添加下面的自定義目標項目文件,或通過所有項目導入的文件你想......得到這個行爲與

<Target Name="MyResolveReferences" 
    DependsOnTargets="ResolveReferences" 
    Returns="@(ReferenceCopyLocalPaths)"> 
    </Target> 

然後,您可以直接調用此目標並捕獲項數組你有興趣,因爲這短暫的目標宣佈它作爲「回報」的價值,

<Target Name="BuildDocumentationForReferencedProjects"> 
    <MSBuild 
    Projects="@(ProjectReference)" 
    Targets="MyResolveReferences" 
    ... 
    > 
    <Output 
     TaskParameter="TargetOutputs" 
     ItemName="MyReferenceCopyLocalPaths" 
     /> 
    </MSBuild> 
    <Message Text="Paths = '@(MyReferenceCopyLocalPaths)'" /> 
    </Target> 

除了@(ReferenceCopyLocalPaths)還有其他一些它em數組可能很有意思,只需在Microsoft.Common.targets中查找爲ResolveAssemblyReferences目標(我的〜〜1400行)中的ResolveAssemblyReference任務聲明的所有輸出。

+0

我不知道你可以用這種方式返回的值。這是一個好主意! – 2011-05-30 15:16:48

+1

看起來這是一個.NET 4.0的東西。任何想法如何與.NET 3.5做到這一點? – 2012-05-11 18:05:43