从使用Directory.Build.props中排除特定项目

24

我有一个包含大约350个项目的新Visual Studio解决方案。编译.sln文件需要很长时间,因此我实现了Directory.Build.props来避免复制不需要复制到本地目录的引用,以便更快地进行构建。以下是我在根文件夹下的Directory.Build.props文件中使用的代码。

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemDefinitionGroup>
  <Reference>
    <Private>False</Private>
  </Reference>
  <ProjectReference>
     <Private>False</Private>
  </ProjectReference>
</ItemDefinitionGroup>
</Project>

由于我将Directory.Build.props放在根文件夹下,因此它被应用于所有项目。

问题: 如何排除一些项目不应用Directory.Build.props,以便引用可以被复制到本地。

简而言之,我希望Directory.Build.props仅适用于解决方案文件下的300个项目,其余50个项目需要被排除在此之外。

如何/在哪里编写一个条件来排除这段代码影响某些项目


你可以切换到 Directory.Build.targets 并设置一个变量,以确定项目是否希望应用规则。 - Raymond Chen
你真的需要一个包含那么多项目文件的解决方案吗?在这种情况下,我会为系统的不同部分创建多个.sln文件。我很难相信你需要同时加载所有350个文件 :-) - bytedev
您也可以使用相对较新的解决方案筛选器来打开较少的项目:https://learn.microsoft.com/zh-cn/visualstudio/ide/filtered-solutions?view=vs-2019 - Max
2个回答

34

对于其他遇到同样问题的人,还有另一个技巧可用于排除某些项目使用根目录下的Directory.Build.props文件。

如果您在要排除的项目中添加一个虚拟的Directory.Build.props文件,则不会使用来自根目录的Directory.Build.props。这是因为MSBuild从项目位置向上遍历目录结构,直到找到第一个Directory.Build.props为止。那将被使用。此行为在Microsoft文档的 自定义生成 页面的搜索范围下有文档记录。

虚拟Directory.Build.props示例:

<Project>
    <!-- Only here so that the default Directory.Build.props will not be used. -->
</Project>

我发现这是解决这个问题的一种方便方式,尤其是当只需要排除几个项目时。


1
对我来说很有效,这是一种处理此类问题的相当惯用方式。希望至少被考虑为一个可接受的答案。 - Panzercrisis

4

我不得不用一种比较巧妙的方法来解决这个问题。

在我的例子中,有一个自定义分析器项目,我不希望它包含在另一组项目中。最终我在Directory.Build.props中编写了类似以下的内容:

<Project>
  ...

  <Choose>
    <When Condition="$(MSBuildProjectName)!='Analyzer' AND ...">
      <ItemGroup>
        <ProjectReference Include="..\Analyzer\Analyzer.csproj">
          <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
          <OutputItemType>Analyzer</OutputItemType>
        </ProjectReference>
      </ItemGroup>
    </When>
    <Otherwise>
       ...
    </Otherwise>
  </Choose>

  ...
</Project>

我填写了...用于跳过我想要跳过的项目。
我知道这可能不是您在寻找的确切答案,但我进行了大量研究,也无法找到任何按您所描述的方式实现它的方法。我发布的内容是我能够通过名称过滤来排除特定项目应用于某些事物的唯一方法。我知道这很“hacky”并且不好,但这是唯一能为我工作的东西。
另外请注意<Otherwise></Otherwise>可能转换为<Otherwise />,甚至可能完全可选。我将其留在那里,以便如果需要,您可以放置其中的内容。

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