3

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

我在想一些事情:

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

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

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

4

2 回答 2

2

我不知道任务,但已经有包含所有项目的属性。只需查看您的典型项目文件,您就会看到它们被添加到哪个集合中。

请注意属性ContentCompileFolder ... 任何时候将文件添加到项目时,它都会被放入其中一个主要集合中,如下所示:

<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>

然后你可以做这样的事情来将现有属性中的值放入你的属性中(条件属性充当过滤器):

<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 任务,您将能够更了解我在此处发布的内容。这真的很容易上手。

于 2008-11-04T06:04:31.283 回答
0

我将以下内容用于 SSRS 项目的解决方案(不在 TFS 下构建 w/o 与安装在构建框上)。基本上,我们要求将 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>

只需将 Copy Task 的使用替换为您需要对包执行的任何操作。当然,这将在您的解决方案根目录中获取所有内容,但如果您使用 TFS,那么您应该只有可构建的工件。

于 2014-03-28T00:12:36.453 回答