【问题标题】:Get XML Documentation files from TFS Team Build script从 TFS Team Build 脚本获取 XML 文档文件
【发布时间】:2010-12-28 22:38:45
【问题描述】:

我在我们的 TFS 环境中基于http://geekswithblogs.net/jakob/archive/2009/03/05/implementing-dependency-replication-with-tfs-team-build.aspx 设置了依赖项复制方案。

这使用CompilationOutputs 项目组来获取构建的 DLL 文件并将它们分支/合并到依赖项目中。我的问题是 CompilationOutputs 项目组仅包含 DLL,我还想包含 XML 文档文件,因此在使用这些库时可以获得智能感知文档提示。是否有不同的项目组包含这些,或不同的方法?我是否需要手动查找 xml 文件并将它们添加到项目组中?

我们现在使用的是 TFS 2010,所以如果那里有新的东西,我们可以尝试利用它(尽管如果我不必将整个方案转换为使用工作流过程,那就太好了。 ..)

【问题讨论】:

    标签: tfs msbuild tfsbuild xml-documentation


    【解决方案1】:

    根据您复制并检查输出的文章:

    <Copy SourceFiles="@(CompilationOutputs)" DestinationFolder="$(ReplicateSourceFolder)"/>
    <Exec Command="$(TF) checkin /comment:&quot;Checking in file from build&quot; &quot;$(ReplicateSourceFolder)&quot; /recursive"/>
    

    您不能在签入前添加第二个复制行以使用元数据复制 xml 文件吗?

    <Copy SourceFiles="%(CompilationOutputs.RootDir)%(CompilationOutputs.Directory)\%(CompilationOutputs.Filename).xml" DestinationFolder="$(ReplicateSourceFolder)"/>
    

    这是另一个使用内联任务的选项,它构建另一个项目组,更改扩展名,以便只添加实际存在的 doc 文件:

     <Target Name="Test">
    
        <ChangeExtension InputFiles="@(CompilationOutputs)" Extension=".xml">
          <Output TaskParameter="OutputFiles" ItemName="DocFiles" />
        </ChangeExtension>
    
        <Copy SourceFiles="@(CompilationOutputs)" DestinationFolder="$(ReplicateSourceFolder)"/>
        <Copy SourceFiles="@(DocFiles)" DestinationFolder="$(ReplicateSourceFolder)"/>
      </Target>
    
      <UsingTask TaskName="ChangeExtension" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
        <ParameterGroup>
          <InputFiles ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true"/>
          <Extension ParameterType="System.String" Required="true"/>
          <OutputFiles ParameterType="Microsoft.Build.Framework.ITaskItem[]" Output="true"/>
        </ParameterGroup>
        <Task>
          <Code Type="Fragment" Language="cs">
            <![CDATA[
          if (InputFiles.Length > 0)
          {
            List<TaskItem> results = new List<TaskItem>();
            for (int i = 0; i < InputFiles.Length; i++)
            {
              ITaskItem item = InputFiles[i];
              string path = item.GetMetadata("FullPath");
              string docfile = Path.ChangeExtension(path, Extension);
              if (File.Exists(docfile))
              {
                results.Add(new TaskItem(docfile));
              }
            }
            OutputFiles = results.ToArray();
          }
            ]]>
          </Code>
        </Task>
      </UsingTask>
    

    【讨论】:

    • 这看起来应该可以工作(我没有为所有项目生成 XML 文件,所以我使用的是第二种方法)。但是,Team Build 2010 用于运行构建的 UpgradeTemplate.xaml 工作流似乎将其作为 MSBuild 3.5 运行,因为我收到“错误 MSB4067:元素 &lt;UsingTask&gt; 下方的元素 &lt;UsingTask&gt; 无法识别。 "
    • 话虽如此,我在日志中发现了以下内容,看起来它正在调用4.0版本:C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe /nologo /noconsolelogger "C:\Builds\1\project\build\BuildType\TFSBuild.proj" /m:1 "@C:\Builds\1\project\build\BuildType\TfsBuild.rsp"
    • 在 TFSBuild.proj 中设置的 ToolsVersion 属性是什么。如果它设置为 3.5,我会看到同样的问题。将其设置为 4.0 过去了。另一种选择是将自定义任务创建为单独的程序集并以这种方式包含它。
    猜你喜欢
    • 2013-07-06
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    • 2020-08-19
    • 2017-03-08
    • 1970-01-01
    • 2013-01-31
    相关资源
    最近更新 更多