为什么需要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的更多相关文章

  1. 清理Visual Studio解决方案临时文件:Clean Visual Studio Solution Temporary File Build20160418

    复制保存到任意文件名.bat,放置在Visual Studio Solution目录下. 当Visual Studio Solution目录过于庞大或打算拷贝移动Visual Studio Solut ...

  2. Visual Studio解决方案vs2005/vs2008/vs2010/vs2012/vs2013/vs2015版本互相转换工具

    原文:http://blog.csdn.net/xiejiashu/article/details/52397641   本文转自EasyDarwin团队成员Alex的博客:http://blog.c ...

  3. Visual Studio解决方案的目录结构设置和管理

    摘至:http://blog.csdn.net/lp310018931/article/details/47991759 首先,解决方案和项目文件夹包含关系(c++项目): VS解决方案和各个项目文件 ...

  4. visual studio 2015引入开源控件DockPanel(最简单的方法)

    一.DockPanel简介 DockPanel是一个开源控件,能够实现子窗口的浮动,在官方给的demo有演示,在vs2017微软已经集成进入常用控件中.我主要使用的是多窗口浮动,和tabControl ...

  5. 用资源管理器右键编译 Visual Studio 解决方案文件

    每次改动 VC 工程之后都要重新编译,每次 VS 又会生成调试数据库文件,很费时间,于是研究了一下如何在资源管理器中直接编译,还真发现了解决办法. 以下是适用 Visual Studio 2008 的 ...

  6. Visual Studio 2012,创建工程Build Driver,基于纯Source Code.

    拿到一堆纯代码,怎么去Create Project,设置Include路径,lib路径,要不要Pre-compile技术,配置Project之间的依赖关系. SourcesConverter  Bas ...

  7. Visual Studio解决方案及项目的配置

    配置解决方案的属性 1.配置解决方案平台,该配置实际上修改的是解决方案目录下的sln(solution)文件. 配置项目的属性 1.配置项目平台及项目的目标平台:项目-右键-属性-生成(竖着第二个选项 ...

  8. Visual Studio 2015官方汇总包括下载和视频

     7月20日 23:30 Visual Studio 2015正式版正式发布,作为微软新一代开发利器,在全地球乃至全宇宙乃至全太阳系中最强大 且没有之一的IDE(上述描述来自微博用户评论)跨平台支持成 ...

  9. 免费的Visual Studio的插件

    在做了深入(的)研究之后(通过在google网站搜索),,我编译了15个免费Visual Studio 2005插件表..其中一些插件将提高您(的)代码(的)质量,,另外一些能使您编译(的)更快,,但 ...

  10. 解析Visual Studio 2015促进生产力的10个新功能

    1 性能提示 Performance Tips 当我们想知道执行一段代码所耗费的时间时,需要借助于.NET 框架的Stopwatch类,像下面这样: class Program { static vo ...

随机推荐

  1. [转帖]关于F5负载均衡你认识多少?

    https://www.cnblogs.com/xiexun/p/10718348.html 网络负载均衡(load balance),就是将负载(工作任务)进行平衡.分摊到多个操作单元上进行执行,例 ...

  2. 高性能Redis服务器注意事项

    摘要 昨天简单理了理安装与配置相关的 但是很多比较重要的核心性能参数并没有进行学习与探讨 就基于昨天理解不深入的地方进行进一步的学习与了解 希望能够提高Redis-Server的性能. 第一部分: 规 ...

  3. Linux bridge使用dummy接口调用IPVS的问题

    Linux bridge使用dummy接口调用IPVS的问题 在IPVS: How Kubernetes Services Direct Traffic to Pods一文中,作者给出了一个简单的组网 ...

  4. vue基础系列文章12---创建脚手架

    一.交互式命令行创建 1.运行 vue create myvue 选择默认创建模式,会在指定的文件夹下创建文件 2.进入到myvue文件夹,运行:npm  run serve 3.访问本地的地址就可以 ...

  5. C# MVC+NHibernate 分页

    一.页面代码,分为三部分,一是查询条件部分,二是数据部分,二是页码条 <div id="ticketoutquery"> <table> <tr> ...

  6. TienChin 引入 MyBatisPlus

    在父工程当中添加版本号,统一管理: <mybatis-plus.version>3.5.1</mybatis-plus.version> 在父工程当中添加 MyBatisPlu ...

  7. 图解Java原理

    1:强制类型转换数据溢出 2:顺序结构的流程图 3:单if语句的流程图 4:标准if-else语句的流程图 5:扩展if-else语句的流程图 6:for循环流程图

  8. SSD数据不能恢复?或许还有的救

    我们经常说机械硬盘相对于固态硬盘的一个优势是数据可以恢复,难道SSD固态硬盘的数据就不能恢复了吗? 这里先简单介绍一下SSD的工作方式,SSD中的数据是以电子的形式通过浮栅保存的,写入就是通过增加电压 ...

  9. Vulkan学习苦旅01:最初的相遇(学习路线、参考资料与环境配置)

    提示:博主本人也在努力学习Vulkan中,文中可能有写错的地方,敬请大家批评指正. 这个世界只有两种人:会Vulkan的和不会Vulkan的,大概不存在"只会一点"的中间状态.学习 ...

  10. 零基础入门学习Java课堂笔记 ——day06

    面向对象(中) 1.封装 "高内聚,低耦合" 高内聚:类内部的细节自己完成,不允许外部干涉 低耦合:仅暴露少量方法给外部使用 属性私有 在Java中可以通过private关键字给方 ...