15

我有一个新的视觉工作室解决方案,它有大约 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 个项目需要排除在此之外

我如何/在哪里可以在上述代码中编写一个条件,以排除受此代码影响的某些项目

4

2 回答 2

19

对于其他处理相同问题的人,还有另一个技巧可以用来排除某些项目使用在根级别找到的 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>

我发现这是解决此问题的便捷方法。尤其是在处理需要排除的少数项目时。

于 2020-07-22T22:21:04.717 回答
3

我不得不以一种 hacky 的方式解决这个问题。

在我的示例中,我编写了一个自定义分析器项目,我不想将其包含在另一组项目中。我最终在我的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>

我填写...了我希望跳过的项目。

我知道这可能不是您正在寻找的确切答案,但我进行了大量研究,也无法找到按照您描述的方式进行操作的任何方法。我发布的内容是我能够通过名称过滤来实现将某些事物排除在特定项目之外的唯一方法。我知道这很糟糕而且很糟糕,但这是唯一能够为我工作的东西。

另请注意,<Otherwise></Otherwise>可能会变成<Otherwise />可能,甚至可能完全是可选的。我把它留在那里,以便您可以在需要时将东西放入其中。

于 2019-11-05T18:05:16.233 回答