是否可以将 Directory.Build.Props 的范围限制为单个 Visual Studio 解决方案?



我有一个Visual Studio解决方案,里面有100多个项目。我想将某些设置应用于所有项目,所以我使用了Directory.Build.Props文件,它工作得很好。但是,在阅读文档后,我刚刚意识到子目录中的所有解决方案也将使用这些设置,但我不想影响这些解决方案,因为我不维护它们。有没有办法将 Directory.Build.Props 文件的范围限制为当前目录或特定解决方案?(也许您可以自定义 Props 文件的名称并将其导入到特定解决方案中?

例如,考虑按如下方式组织的目录结构:

/code/MySolutionFile.sln
/code/Project001/
/code/Project002/
/code/Project003/
...
/code/Project100/
/code/OtherStuff/OtherStuff.sln
/code/OtherStuff/ProjectA
/code/OtherStuff/ProjectB
/code/OtherStuff/[lots of other solutions somewhere in this directory tree]

我已将Directory.Build.Props文件放在/code目录中,因为我想定义/code/MySolutionFile.sln中所有项目的设置。但我不想影响/code文件夹子目录中的任何其他解决方案。

如果所有其他方法都失败了,我想我可以创建一个空的 Directory.Build.Props 文件,并将其放在包含解决方案文件的每个目录中,除了我希望我的文件应用到的目录中。(但这感觉像是最后的手段。

以这种方式修改我的 Directory.Build.props 文件可以实现我的目标:

<Project>
<PropertyGroup Condition="$(SolutionFileName) == 'MySolution.sln'">
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>
</Project>

这通过将PropertyGroup设置为有条件地运行规则来工作。(请注意,该条件也可以应用于特定规则而不是组。在这种情况下,我能够使用解决方案文件的名称将此规则的范围限制为我所需的解决方案,而不会影响任何其他解决方案。

但需要注意的是,该文档声称解决方案变量仅在 IDE 中使用时才可用。但是,通过我有限的测试,当我从命令行使用 msbuild 时,规则也会正确应用,如下所示:msbuild.exe MySolution.sln

我从VS开发人员命令提示符和常规Windows命令提示符对其进行了测试,并且它们仍然正确读取$(SolutionFileName)变量。

MSBuild 支持对许多类型的元素(包括PropertyGroup和单个属性(进行Conditions。在这种情况下,您不需要Choose-When- 您可以直接将条件放在PropertyGroupTreatWarningsAserrors上。

有没有办法将 Directory.Build.Props 文件的范围限制为 当前目录,还是特定的解决方案?(也许你可以 自定义 Props 文件的名称并将其导入到特定的 解决方案?

Directory.Build.Props将作用于包含许多包含xxxx.csproj文件的当前文件夹的xxxx.sln,然后还作用于所有子文件夹的xxxx.proj文件。对于它找到的任何xxx.proj文件,它将一次下降一步,并且它是由该文件设计的。您可以看到它的搜索范围。

由于您的解决方法效果很好,但有点复杂,或者如果您愿意,可以尝试我的解决方案:

解决方法

请在文件夹代码下创建一个名为MyStuff的文件夹,然后将Project001---Project100放入此文件夹中。之后,将Directory.Build.Props文件放入MyStuff文件夹中。有了它,该文件将仅影响Project001---Project100

希望它能帮助你。

最新更新