我有一个新的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个项目需要从中排除
如何/在上面的代码中写条件,以排除某些受此代码影响的项目
答案 0 :(得分:3)
对于其他处理相同问题的人,还有另一种技巧可以用来排除某些项目使用根目录级别的Directory.Build.props文件。
如果在要排除的项目中添加虚拟Directory.Build.props文件,则不会使用根目录中的Directory.Build.props。这是因为MSBuild从项目位置向上移动目录结构,直到找到第一个Directory.Build.props。那将被使用。在Microsoft文档的Search scope下的自定义您的构建页上记录了此行为。
虚拟Directory.Build.props
的示例:
<Project>
<!-- Only here so that the default Directory.Build.props will not be used. -->
</Project>
我发现这是解决此问题的便捷方法。尤其是在只处理少数几个需要排除的项目时。
答案 1 :(得分:1)
我不得不以一种有点怪异的方式解决这个问题。
在我的示例中,有一个我写的自定义分析器项目,我不想包含在另一组项目中。我最终在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 />
,甚至可能完全是可选的。我把它留在那里,以便您可以根据需要在其中放置东西。