昌江黎族自治县网站建设_网站建设公司_悬停效果_seo优化
2025/12/30 17:21:49 网站建设 项目流程

声明:个人笔记,概不负责

Directory.Build.props 是 MSBuild 的功能,早晚得遇上。

不然,土了吧唧的 csproj 配置,实在是不利于 统筹安排 项目中各个 csproj 中有些设置(的统一)
虽然 sln 也土了,新时代中 降为一种 选择,而不是 捆绑,但 值得真爱 —— 用 VS 调试,是真香.
项目可以选择 VS —— 基于 半残的、抽象视图 的 sln 布局来开发,
也可以选择 VS Code —— 基于 平凡的 目录布局来开发,也真香.
也可以,同时选择 VS 与 VS Code 两个一起爱,这就 自由的感觉…… 吧 …… 啊!

基本工作方式

MSBuild 会从 csproj 所在目录开始(含)往上层目录爬,一直爬到磁盘顶级目录,沿途搜索所有 Directory.Build.props 文件
然后,再往收敛回来,(根据条件、可能、逐个合并所有 Directory.Build.props 文件), 最后(默认)合并到 csproj 文件中

如何在 当前 Directory.Build.props 中, 使用上层目录的 Directory.Build.props ?
如何在 csproj 中,阻止使用 Directory.Build.props 文件 ?

搜寻断裂

虽然 MSBuild 自己会,递归向上不停的找 Directory.Build.props 文件,
但合并时,却不是那么一回事.

对 csproj 文件来说,只要 csproj 所在目录(含),向上的 任意一层 目录存在 Directory.Build.props 文件,就会自动导入。
层次中空多少个,都无所谓。
但是,只会导入离它最近的那个。

而 Directory.Build.props 则不是,只有 手搓代码,指定合并上层目录的 Directory.Build.props 才会做。
否则,当前 Directory.Build.props 就是个独立天地,不会 自动导入上层目录的配置,上面没有天了。

也就是讲,它可以用来 故意打断,来自上面的、不知道那一层的 Directory.Build.props 文件的干扰
——比如说,在 csproj 文件旁故意放个空白 Directory.Build.props 文件,或放在 csproj 合理的爸爸层

要在 Directory.Build.props 手搓代码,合并(层次中空多少个,都无所谓)上一层目录的 Directory.Build.props 文件,有个朴素的手法

<!-- File-first version-->
<Project><Import Project="$([MSBuild]::GetPathOfFileAbove(Directory.Build.props, $(MSBuildThisFileDirectory)..))" Condition=" '$([MSBuild]::GetPathOfFileAbove(Directory.Build.props, $(MSBuildThisFileDirectory)..))' != '' " /></Project>

其他手法(历史档案馆,可略过)

正确的手法,古已有之,只是原文有点以装逼为主,来自 2010 年的呼唤——MSBuild Property Functions (2)

<!-- Dir-first version-->
<!-- [MSBuild Property Functions (2)] https://devblogs.microsoft.com/visualstudio/msbuild-property-functions-2 -->
<Project><Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory).., Directory.Build.props))Directory.Build.props" Condition=" '$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory).., Directory.Build.props))' != '' " />
</Project>

下面是典型的 错误手法 ,有两个逻辑错误
(1) 根本就不会 连续 向上爬,只知道 找一个爸爸,不会一直找 爸爸的爸爸
(2) 如果 父目录没有这个文件,则会出错
这个手法也不是不行 —— 永远保证 爸爸链条上,每层都有 Directory.Build.props 这个文件,哪怕是空的
这是个 令人崩溃 但的确 也可以工作 的 手法 😄

<Project><Import Project="$(MSBuildThisFileDirectory)..\Directory.Build.props"> 
</Project>

当然 手法千千万,花活 无止尽。 需要执念,与根据 实际情况 随机应变。
在 Directory.Build.props 中 引用上层、其他 props 的情况千奇百怪
—— 莫名其妙 搞复杂了,就是活折腾。
—— 越是庞大的、有层次的代码,越会有这 执着的追求,折腾这玩意 得加钱!

就是 不 爱

如何在 csproj 中,阻止使用 Directory.Build.props 文件 ?

方案 A(最简单):在该项目目录放一个空的 Directory.Build.props

方案 B(次简单):改 csproj 文件

<PropertyGroup><ImportDirectoryBuildProps>false</ImportDirectoryBuildProps>
</PropertyGroup>

方案 C(细腻控制):在顶层 Directory.Build.props 里加条件,只对特定项目生效

==== 就这样吧,结束线

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询