当前位置: 首页 > news >正文

SW 随笔 005 — 星火传递 Directory.Build.props (C# 项目)

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

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 里加条件,只对特定项目生效

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

http://www.gsyq.cn/news/182005.html

相关文章:

  • Miniconda配置PyTorch环境的最佳实践方法
  • 2026年中国企业接入Gemini API的首选:支持SLA保障的服务商推荐 - 智造出海
  • 如何用指纹浏览器构建安全隔离的数字身份?
  • Miniconda-Python3.9 SSH连接配置图文教程
  • Miniconda-Python3.9环境下安装TensorFlow和PyTorch的详细步骤
  • Miniconda-Python3.9如何支持PyTorch与gRPC高效通信
  • Miniconda-Python3.9如何提升GPU算力利用率
  • 苏州、上海、无锡地区海外品牌营销推广哪家好?2026年海外社媒运营推广服务商宝藏清单,涵盖Facebook、LinkedIn、TikTok、INS、Google等多平台 - 品牌2025
  • 一个python整理笔记脚本
  • Miniconda-Python3.9如何支持PyTorch与Homomorphic Encryption集成
  • 推荐几家TikTok营销服务商,五家效果不错的TikTok代运营公司、TikTok海外推广公司详细介绍 - 品牌2025
  • 2025—2026年液压机厂家推荐:闭式液压机/框架液压机/冲床液压机/315吨框架式液压机/315吨液压机/500吨液压机优质厂商深度对比! - 海棠依旧大
  • 2026软件测试工程师经典面试题
  • 2025Q4升降机厂家推荐榜:苏州卓高登顶,专精品牌成采购优选 - 品牌智鉴榜
  • Miniconda-Python3.9镜像支持Jupyter Lab的配置方法
  • PyTorch健康检查接口开发:Miniconda-Python3.9环境测试
  • PyTorch在线推理服务构建:Miniconda-Python3.9环境支撑
  • Miniconda-Python3.9安装PyYAML、NumPy等常用库指南
  • 抱歉,系统超时,请稍后重试。
  • PyTorch容错机制设计:基于Miniconda-Python3.9环境验证
  • 学长亲荐10个AI论文工具,MBA毕业论文轻松搞定!
  • 收藏!深入浅出Transformer核心架构:Encoder与Decoder实战指南
  • 护网新手集合!平民化挖掘技巧 + 实战例子,你们踩过哪些坑?评论区聊聊!
  • 赋能研发升级:IPD管理咨询的标杆案例与核心方案
  • java计算机毕业设计校园招聘管理系统 高校毕业生智慧就业撮合平台 校企协同实习与招聘一体化系统
  • 【UE】优化技巧:将造成卡顿的主线程任务,分散到多个帧进行分帧处理
  • Miniconda-Python3.9配合VS Code远程开发指南
  • 【必收藏】2025中国AI大模型狂飙史:从技术突破到产业赋能的全面解析
  • upload markdown - ling
  • Java开发者转型AI大模型完全指南:从零到专家的进阶路径_Java程序员转型大模型应用开发