MSBUILD为解决方案中的所有项目生成xml文档文件(无需触及项目)

时间:2012-02-01 00:04:27

标签: msbuild tfs2010

我正在尝试为解决方案中的所有项目创建XML文档,即使未在项目属性中选中该选项(这也是关键点)。

我正在使用TFS 2010 SP1并在我的构建定义的“MSBuild Arguments”字段中尝试使用此“/ p:TreatWarningsAsErrors = true / p:GenerateDocumentation = true”。它不会产生任何结果。

我也尝试使用/p:DocumentationFile=foo.xml,它确实可以工作但是我假设文件被最后编译的项目覆盖了,所以我尝试使用变量而不是运气,我试过

/p:DocumentationFile=$(Project).xml,
/p:DocumentationFile=$(localProject).xml
/p:DocumentationFile=$(localBuildProjectItem).xml

有没有办法为MSBUILD中的所有项目创建XML文档,即使项目中没有选中该选项?

PS:是的,我已经看到了另一个类似于此的线程,但我不想修改项目,这就是用MSBUILD做的全部内容。

感谢您的时间

2 个答案:

答案 0 :(得分:2)

  1. 打开您的流程模板(即:$/yourproject/BuildProcessTemplates/DefaultTemplate.xaml

  2. 向下滚动以查找Compile the Project活动。

  3. 添加名为DocumentationFile的新变量,type = String,scope = Compile the Project
  4. 将其默认值设置为:

    String.Format("{0}.XML", System.IO.Path.GetFileNameWithoutExtension(serverBuildProjectItem)) Compile the Project

  5. 保存更改并向下滚动到Run MSBuild for Project活动。

  6. CommandLineArguments中,设置以下值:  String.Format("/p:SkipInvalidConfigurations=true {0};DocumentationFile={1}", MSBuildArguments, DocumentationFile) Run MSBuild for Project

  7. 签入更改并构建。即使项目未设置文档,也应该生成文档。

答案 1 :(得分:0)

我也想实现这一目标,最后我按照以下步骤提出了一个解决方案:

  • 在解决方案的根文件夹中创建一个Directory.Build.props文件。
  • GenerateDocumentationFile属性设置为true
  • 设置DocumentationFile属性。

默认情况下,您将使用$(OutputPath)$(AssemblyName)属性来设置文档文件名,如下所示:

<DocumentationFile>$(OutputPath)$(AssemblyName).xml</DocumentationFile>

但是不幸的是,由于Directory.Build.props文件先被处理,因此无法正常工作,因此.csproj文件中设置的属性目前不可用。

幸运的是,还有另一个属性可以获取当前项目名称:$(MSBuildProjectName)

默认情况下,输出路径如下:

  • 对于Web项目:bin\
  • 对于其他项目:bin\$(Configuration)\,例如bin\Debug\

要确定某个项目是否为Web项目,我使用了以.Web.WebApi结尾的项目名称

因此,在我的情况下,完整的Directory.Build.props文件如下所示:

<Project>
    <PropertyGroup>
        <GenerateDocumentationFile>true</GenerateDocumentationFile>
        <!-- The rest is omitted for clarity. -->
    </PropertyGroup>

    <PropertyGroup>
        <!-- warning CS1591: Missing XML comment for publicly visible type or member -->
        <NoWarn>1591</NoWarn>
    </PropertyGroup>

    <PropertyGroup Condition="$(MSBuildProjectName.EndsWith('.Web')) Or $(MSBuildProjectName.EndsWith('.WebApi'))">
        <DocumentationFile>bin\$(MSBuildProjectName).xml</DocumentationFile>
    </PropertyGroup>

    <PropertyGroup Condition="!$(MSBuildProjectName.EndsWith('.Web')) And !$(MSBuildProjectName.EndsWith('.WebApi'))">
        <DocumentationFile>bin\$(Configuration)\$(MSBuildProjectName).xml</DocumentationFile>
    </PropertyGroup>
</Project>

如您所见,还有一个<NoWarn>1591</NoWarn>属性集,该属性集告诉编译器不要为缺少XML文档的公共可见类型生成警告消息。

希望有帮助。