从MSBuild任务中的解决方案输出所有文件

时间:2008-11-03 09:37:02

标签: msbuild

在MSBuild中,我想调用一个任务来提取特定解决方案中所有项目中的所有文件,并将这些文件保存在一个属性中,该属性可以传递给其他任务(用于处理等)。

我正在思考以下几点:

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

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

将输出解决方案中项目中所有文件的列表,我可以使用AllFilesInSolution属性作为其他分析任务的输入。这是一个已经存在的任务还是我需要自己构建它?如果我需要自己构建它,那么任务应该输出一个字符串数组还是ITaskItems或其他东西?

2 个答案:

答案 0 :(得分: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>

或者您可以手动执行(Include属性使用现有属性OutputPath,但它指示包含所有文件的路径):

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

MSDN MSBuild文档中有更多详细信息,当我使用自定义构建任务和非常有用的内容时,我会阅读这些文档。阅读CreateItem任务,你将能够更好地理解我在这里发布的内容。这很容易接受。

答案 1 :(得分:0)

我将以下内容用于SSRS项目的解决方案(在构建盒上安装的TFS w / o vs下不构建)。基本上我们要求将RDL捆绑到构建输出中,以便我们可以标记要发布的构建。

<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,那么您应该只有可构建的工件。