【问题标题】:exclude certain projects from using Directory.Build.props排除某些项目使用 Directory.Build.props
【发布时间】:2019-05-15 18:15:33
【问题描述】:

我有一个新的 Visual Studio 解决方案,其中包含大约 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 并让项目设置一个变量,说明他们是否希望应用规则。
  • 您真的需要一个包含这么多项目文件的解决方案吗?在这些情况下,我会为系统的不同部分创建多个 .sln 文件。我很难相信你需要同时加载所有 350 个 :-)
  • 要打开较少的项目,您还可以使用相对较新的解决方案过滤器:docs.microsoft.com/en-us/visualstudio/ide/…

标签: c# visual-studio-2017-build-tools


【解决方案1】:

对于其他处理相同问题的人,还有另一个技巧可用于排除某些项目使用在根级别找到的 Directory.Build.props 文件。

如果您在要排除的项目中添加虚拟 Directory.Build.props 文件,则不会使用根目录中的 Directory.Build.props。这是因为 MSBuild 从项目位置向上遍历目录结构,直到找到第一个 Directory.Build.props。那将被使用。此行为记录在 Microsoft 文档中Search scope 下的 Customize your build 页面上。

假人Directory.Build.props的样本:

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

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

【讨论】:

  • 为我工作,这是处理此类事情的一种相当惯用的方式。希望它至少被认为是一个公认的答案。
【解决方案2】:

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

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

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

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

还要注意&lt;Otherwise&gt;&lt;/Otherwise&gt; 可能会变成&lt;Otherwise /&gt;,甚至可能完全是可选的。我把它放在那里,以便您可以在需要时将东西放入其中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 2015-09-26
    相关资源
    最近更新 更多