为产品的一堆Visual Studio解决方案引入Directory.Build.props
为什么需要Directory.Build.props?
一个产品有了多个甚至几十个解决方案之后,每个解决方案里面的项目可能会引用一个dll包的不同版本,因此需要集中管理dll包的版本号。
.NET的Directory.Build.props文件就能解决这个问题。Visual Studio在“生成”和“发布”的时候,能读取Directory.Build.props中的定义,在Linux容器中的Gitlab-Runner里面执行dotnet restore等命令的时候,也能读取Directory.Build.props。
Directory.Build.props的结构
截图如下:

文字版本如下:
<Project>
<Import Project="version-numbers/Directory.Build.Yee.AspNetCore.props" />
<Import Project="version-numbers/Directory.Build.Yee.props" />
<Import Project="version-numbers/Directory.Build.Yee.Utils.props" />
<Import Project="version-numbers/Directory.Build.Yee.Cloud.props" />
<PropertyGroup>
<LangVersion>latest</LangVersion>
<!--<Nullable>enable</Nullable>-->
<NoWarn>$(NoWarn);NU1603;CS8618;CS8625;CS1998;CS8600;CS8629;CS8603;8601;8602;8603;8604</NoWarn>
<!--<ImplicitUsings>enable</ImplicitUsings>-->
<PackageProjectUrl>https://zimuceping.alida.group</PackageProjectUrl>
<Product>代码改变人生</Product>
<Authors>David Xiong</Authors>
<PackageReleaseNotes>https://zimuceping.alida.group/ReleaseNotes.md</PackageReleaseNotes>
<Copyright>Copyright 2022 (c) 阿力达</Copyright>
</PropertyGroup>
<PropertyGroup>
<AbpVersion>8.0.4</AbpVersion>
<LeptonX_Version>3.0.4</LeptonX_Version>
<IdentityModel_Version>6.2.0</IdentityModel_Version>
<IdentityModel_OidcClient_Version>5.2.1</IdentityModel_OidcClient_Version>
<CommunityToolkit_Mvvm_Version>8.2.2</CommunityToolkit_Mvvm_Version>
<Microsoft_Windows_CsWin32_Version>0.3.49-beta</Microsoft_Windows_CsWin32_Version>
<System_IdentityModel_Tokens_Jwt_Version>7.0.3</System_IdentityModel_Tokens_Jwt_Version>
<Blazorise_Version>1.4.1</Blazorise_Version>
<ConfigureAwait_Fody_Version>3.3.1</ConfigureAwait_Fody_Version>
<Fody_Version>6.5.3</Fody_Version>
</PropertyGroup>
<PropertyGroup>
<Microsoft_AspNetCore_Authentication_OAuth_Version>2.2.0</Microsoft_AspNetCore_Authentication_OAuth_Version>
<Microsoft_AspNetCore_Diagnostics_HealthChecks_Version>2.2.0</Microsoft_AspNetCore_Diagnostics_HealthChecks_Version>
<Microsoft_AspNetCore_Hosting_Version>2.2.7</Microsoft_AspNetCore_Hosting_Version>
<Microsoft_AspNetCore_Version>8.0.0</Microsoft_AspNetCore_Version>
<Microsoft_AspNetCore_Rewrite_Version>2.2.0</Microsoft_AspNetCore_Rewrite_Version>
Directory.Build.props的特点
1、递归向上寻找
dotnet在还原的时候,会从当前目录下开始查找Directory.Build.props文件,找不到就去父目录里找Directory.Build.props,直到找到一个,就不再向上寻找了。
2、Directory.Build.props文件能Import其它文件
也就是我们能把Directory.Build.props中的包的定义,分拆成多个文件。
这个对于我们已经引用了自动构建技术的,服务器上不停的在为各个项目自动生成新版本,都需要更新这里的版本号。显然,把每个版本号定义,独立到一个文件中,能避免Gitlab Runner完成工作后,写入文件时带来的并发操作的问题。
引申的问题
1、版本号的命名规范
目前我们采用的,就是把包的名字的小数点换成下划线,然后结尾加上“_Version”。每个单词的首字母大写。
2、团队成员如何共享Directory.Build.props及其Import的其他文件呢?
在没有新冠的时候,大家都在一个大地点办公,用Windows的共享目录就可以。
疫情让大家习惯了“分布式”办公,那么用网站来共享Directory.Build.props及其Import的文件,就是最好的方式。
3、Windows环境下编写批处理文件
这里是3个重点
1)download.bat
每次开发人员,想更新所有的文件的时候,要双击download.bat执行。
这个文件的内容如下:
@echo off
del Directory.* /q
for /f %%i in (urls.txt) do (echo %%i
wget %%i --content-disposition
)
dotnet nuget locals plugins-cache --clear
exit
2)urls.txt
为了便于维护,我们把前边脚本要下载的文件的列表,独立用一个纯文本文件来存储
这个文件的内容如下:
http://dev.amihome.cn/version-numbers/Directory.Build.Yee.AspNetCore.props
http://dev.amihome.cn/version-numbers/Directory.Build.Yee.Cloud.props
http://dev.amihome.cn/version-numbers/Directory.Build.Yee.props
http://dev.amihome.cn/version-numbers/Directory.Build.Yee.Utils.props
注意,区分大小写,不要有空格的行
3)wget的包
Windows操作系统的wget从这里下载
https://eternallybored.org/misc/wget/
下载的包,就和download.bat放在一个文件夹下。
最终文件夹下,有下述文件

为产品的一堆Visual Studio解决方案引入Directory.Build.props的更多相关文章
- 清理Visual Studio解决方案临时文件:Clean Visual Studio Solution Temporary File Build20160418
复制保存到任意文件名.bat,放置在Visual Studio Solution目录下. 当Visual Studio Solution目录过于庞大或打算拷贝移动Visual Studio Solut ...
- Visual Studio解决方案vs2005/vs2008/vs2010/vs2012/vs2013/vs2015版本互相转换工具
原文:http://blog.csdn.net/xiejiashu/article/details/52397641 本文转自EasyDarwin团队成员Alex的博客:http://blog.c ...
- Visual Studio解决方案的目录结构设置和管理
摘至:http://blog.csdn.net/lp310018931/article/details/47991759 首先,解决方案和项目文件夹包含关系(c++项目): VS解决方案和各个项目文件 ...
- visual studio 2015引入开源控件DockPanel(最简单的方法)
一.DockPanel简介 DockPanel是一个开源控件,能够实现子窗口的浮动,在官方给的demo有演示,在vs2017微软已经集成进入常用控件中.我主要使用的是多窗口浮动,和tabControl ...
- 用资源管理器右键编译 Visual Studio 解决方案文件
每次改动 VC 工程之后都要重新编译,每次 VS 又会生成调试数据库文件,很费时间,于是研究了一下如何在资源管理器中直接编译,还真发现了解决办法. 以下是适用 Visual Studio 2008 的 ...
- Visual Studio 2012,创建工程Build Driver,基于纯Source Code.
拿到一堆纯代码,怎么去Create Project,设置Include路径,lib路径,要不要Pre-compile技术,配置Project之间的依赖关系. SourcesConverter Bas ...
- Visual Studio解决方案及项目的配置
配置解决方案的属性 1.配置解决方案平台,该配置实际上修改的是解决方案目录下的sln(solution)文件. 配置项目的属性 1.配置项目平台及项目的目标平台:项目-右键-属性-生成(竖着第二个选项 ...
- Visual Studio 2015官方汇总包括下载和视频
7月20日 23:30 Visual Studio 2015正式版正式发布,作为微软新一代开发利器,在全地球乃至全宇宙乃至全太阳系中最强大 且没有之一的IDE(上述描述来自微博用户评论)跨平台支持成 ...
- 免费的Visual Studio的插件
在做了深入(的)研究之后(通过在google网站搜索),,我编译了15个免费Visual Studio 2005插件表..其中一些插件将提高您(的)代码(的)质量,,另外一些能使您编译(的)更快,,但 ...
- 解析Visual Studio 2015促进生产力的10个新功能
1 性能提示 Performance Tips 当我们想知道执行一段代码所耗费的时间时,需要借助于.NET 框架的Stopwatch类,像下面这样: class Program { static vo ...
随机推荐
- [转帖]shell脚本中$0 $1 $# $@ $* $? $ 的各种符号的意义
概述 shell中有两类字符,一类是普通字符,在Shell中除了本身的字面意思外没有其他特殊意义,即普通纯文本:另一类即元字符,是Shell的保留字符,在Shell中有着特殊的含义. 今天主要介绍一下 ...
- 【转】Java类加载器:类加载原理解析
[转]Java类加载器:类加载原理解析 https://www.jianshu.com/p/1f704ad4196e 摘要: 每个开发人员对java.lang.ClassNotFoundExcetpi ...
- BMC修改密码
公司里的服务器都托管出去了, 为了好维护, 都给自己的机器设置了BMC远程管理的端口, 安全起见自己修改了密码. 方法很简单.默认用户密码是 用户:root 密码: root 用户:admin 密码: ...
- 范德蒙德矩阵行列式 & 循环矩阵行列式的证明
范德蒙德矩阵的行列式 \[\begin{vmatrix} 1 & 1 & 1 & \dots & 1 \\ x_1 & x_2 & x_3 & ...
- js 删除数组中的某一个内容
<script type="text/javascript"> let list=["为","啊发大水","阿斯蒂芬& ...
- C# 输入指定日期获取当前年的第一天 、当前年的最后天、某月的第一天 、某月的最后一天
方法 /// <summary> /// 取得当前年的第一天 /// </summary> /// <param name="datetime"> ...
- 【二】tensorflow调试报错、TF深度学习强化学习教学
相关文章: [一]tensorflow安装.常用python镜像源.tensorflow 深度学习强化学习教学 [二]tensorflow调试报错.tensorflow 深度学习强化学习教学 [三]t ...
- C/C++ 感染标志与空字节感染
C/C++ 通过搜索PE结构中的空隙部分,对指定文件写入感染标志,作用是,如果程序被感染过则不再继续感染,而搜索空字节,则是要将恶意代码动态的填充到可执行文件中,并劫持执行流,以下代码就是这两种代码的 ...
- 《ASP.ENT Core 与 RESTful API 开发实战》-- 读书笔记(第2章)
第 2 章 .NET Core 和 ASP.NET Core 2.1 .NET Core 简介 .NET Core 是一个通用的开发平台,最重要的特点是跨平台,同时也是一个开源平台 .NET Core ...
- 深入浅出 Application Insights--学习笔记
摘要 介绍如何将 Application Insights 用于生产上实践,并透过它发现/诊断问题.同时也会介绍如何将 Application Insighs 与其他体系相集成实现 Devops(与发 ...