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

3
在MSBuild中,我想调用一个任务,该任务可以提取特定解决方案中所有项目中的所有文件,并将这些文件保存在一个属性中,以便传递给其他任务(用于处理等)。我考虑的大致思路是:
<ParseSolutionFile SolutionFile="$(TheSolutionFile)">
  <Output TaskParameter="FilesFound" ItemName="AllFilesInSolution"/>
</ParseSolutionFile>

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

我希望能够输出解决方案中所有项目的文件列表,并将AllFilesInSolution属性用作其他分析任务的输入。是否已经存在这样的任务,还是我需要自己构建?如果需要自己构建,任务应该输出字符串数组、ITaskItems数组或其他什么类型的内容?

2个回答

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任务,你就能更好地理解我在这里发布的内容。它真的很容易掌握。


0

我在SSRS项目中使用以下解决方案(在没有在构建服务器上安装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,则应仅具有可构建的工件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接