MSBuild:为主项目生成XML文档,但不包括依赖项目

6
我有一个包含几个项目的.sln文件。为了保持简单,我们称它们为:
- ProjectA - ProjectB - ProjectC
其中,A是主要项目,引用了B和C。我的目标是更新构建脚本,生成ProjectA的XML“智能感知”文档文件,而不会因B和C缺少文档而产生构建警告。
现有的构建脚本如下:
我有一个MSBuild脚本,在构建步骤中包括以下内容:
<PropertyGroup>
    <CustomOutputPath>C:\build\output\</CustomOutputPath>
</PropertyGroup>
<ItemGroup>
    <Projects Include="ProjectA\ProjectA.csproj">
        <Properties>OutputPath=$(CustomOutputPath)</Properties>
    </Projects>
</ItemGroup>
<MSBuild Projects="@(Projects)" />

实际上,在ItemGroup中列出了多个项目,但是为了简单起见,让我们保持简单。

当我运行构建脚本时,它足够聪明,可以为我编译B,C和A,即使我只指定了A。所有输出都出现在“CustomOutputPath”位置。

我最接近的方法...

如果我向我的项目条目添加'DocumentationFile'属性...

<ItemGroup>
    <Projects Include="ProjectA\ProjectA.csproj">
        <Properties>OutputPath=$(CustomOutputPath);DocumentationFile=ProjectA.xml</Properties>
    </Projects>
</ItemGroup>

当 "CustomOutputPath" 中出现 "ProjectA.xml" 时,所有三个项目的项目文件夹中也会出现名为 "ProjectA.xml" 的文件:

  • ProjectA/ProjectA.xml
  • ProjectB/ProjectA.xml
  • ProjectC/ProjectA.xml

尽管它们都被命名为 "ProjectA.xml",但这些文件包含了它们各自项目的智能感知文档。

这会在项目文件夹中产生不需要和误导性的文件,在 B 和 C 中生成缺少文档注释的构建警告。我不想在这些项目中添加文档注释,因此我希望找到一种方式让 MSBuild 仅为 ProjectA 生成文档。

是否有人能提供任何见解或替代方案?


目前为止,我还没有找到直接解决这个问题的方法。我已经按照Skeet的建议(https://dev59.com/PnVC5IYBdhLWcg3wtzoQ#203873)使用#pragma指令来抑制构建警告,并根据Alexey的回答删除了额外的.xml文件。但这些都只是权宜之计。希望能有一个更简洁的解决方案出现。 - Nate Sauber
有更新吗?这是一个非常棘手的问题... - mynkow
没有任何见解。老实说,我尽可能地远离MSBuild。Psake、Rake和Fake更容易使用(虽然我还没有在它们中的任何一个中解决过这个问题)。 - Nate Sauber
1个回答

2

根据我的发现 - DocumentationFile是一个全局级别的属性(并将用于创建DocFileItem - 全局级别项目列表)。据我理解,您无法在单个逻辑脚本中轻松修改它。

您可以做的是在单独的文件中定义特殊目标,该文件将被导入到每个proj文件中(直接编辑proj文件或使用诸如$ CustomBeforeMicrosoftCommonTargets之类的属性),该目标将使用与项目相关的值覆盖DocumentationFile。 结果 - 您可能可以为不同的项目生成不同的文档文件名。

另一种解决方案-在所有projs构建完成后清除所有不必要的文档文件。


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