【问题标题】:Output all files from a solution in an MSBuild task从 MSBuild 任务中的解决方案输出所有文件
【发布时间】:2008-11-03 09:37:01
【问题描述】:

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

我的想法是这样的:

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

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

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

【问题讨论】:

    标签: msbuild


    【解决方案1】:

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

    注意属性 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>
    

    然后您可以执行以下操作将现有属性中的值放入您的属性中(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 任务,您将能够更了解我在此处发布的内容。这真的很容易上手。

    【讨论】:

      【解决方案2】:

      我将以下内容用于 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,那么您应该只有可构建的工件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-15
        • 1970-01-01
        • 1970-01-01
        • 2014-10-01
        • 1970-01-01
        • 2011-06-06
        • 2012-12-16
        相关资源
        最近更新 更多