当前位置: 首页 > 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.jsqmd.com/news/166436/

相关文章:

  • Miniconda-Python3.9安装Scikit-learn进行机器学习
  • PyTorch流量镜像测试:Miniconda-Python3.9环境复制请求
  • 武汉本地雅思培训机构哪家值得信赖?真实口碑机构推荐 - 品牌排行榜
  • PyTorch Electron客户端构建:Miniconda-Python3.9环境打包
  • Miniconda配置PyTorch环境的最佳实践方法
  • Kanass快速上手指南:开发团队如何通过kanass有效管控开发任务
  • Miniconda-Python3.9环境下安装TensorFlow和PyTorch的详细步骤
  • Miniconda-Python3.9环境下实现PyTorch模型RESTful接口封装
  • 展厅设计公司推荐:行业实力机构与服务解析 - 品牌排行榜
  • Miniconda-Python3.9环境下运行Stable Diffusion模型
  • Miniconda-Python3.9环境下生成Markdown报告
  • Miniconda-Python3.9如何提升GPU算力利用率
  • Miniconda-Python3.9环境下使用pip与conda混合安装指南
  • Miniconda-Python3.9安装HuggingFace库完整教程
  • Java正则表达式
  • PyTorch模型API设计规范:Miniconda-Python3.9环境验证
  • Miniconda-Python3.9+GitHub Copilot提升编码效率
  • 一个python整理笔记脚本
  • Miniconda-Python3.9如何支持PyTorch与Homomorphic Encryption集成
  • 当免疫算法遇上物流选址:一场代码驱动的优化之旅
  • Miniconda-Python3.9结合Markdown编写技术文档全流程
  • Miniconda-Python3.9配置Jupyter密码保护机制
  • 2025—2026年液压机厂家推荐:闭式液压机/框架液压机/冲床液压机/315吨框架式液压机/315吨液压机/500吨液压机优质厂商深度对比! - 海棠依旧大
  • PyTorch分布式锁实现:Miniconda-Python3.9环境协调服务
  • Miniconda-Python3.9如何支持PyTorch与MQTT物联网协议集成
  • Miniconda-Python3.9镜像支持Jupyter Lab的配置方法
  • DeFi收益新架构:深度解析质押理财与流动性挖矿的智能合约开发
  • Miniconda-Python3.9安装PyYAML、NumPy等常用库指南
  • PyTorch健康检查接口开发:Miniconda-Python3.9环境测试
  • Miniconda-Python3.9环境下实现PyTorch模型OTA远程升级