为什么需要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. ESXi 虚拟机性能情况简单验证

    1.虚拟化的CPU超售问题. 经过查找资料, 发现 ESXi 5.5 的版本 一个 物理CPU的Core 可以虚拟出 25个vCPU, 升级到ESXi6.0 之后可以虚拟化32个vCPU. 所以虚拟化 ...

  2. Dubbo架构设计与源码解析(一) 架构设计

    作者:黄金 一.架构演变 单应用架构 ----> 垂直架构 ----> 分布式架构 ----> 微服务架构 ----> 云原生架构 二.Dubbo总体架构 1.角色职能 • C ...

  3. TypeScript中typeof的简单介绍

    简单介绍typeof 我们都知道js提供了typeof,用来获取基本数据的类型. 实际上,TS也提供了 typeof 操作符. 可以在 [类型上下文]中进行类型查询. 只能够进行变量或者属性查询. 定 ...

  4. Ant Design Vue数字输入框InputNumber 有值但是验证却不能够通过

    InputNumber 有值但是验证却不能够通过 今天遇见这样一个问题,InputNumber 输入框中有值 但是却却提示验证不能够通过 后来经过分析,怀疑是数据类型不正确, 后面经过验证,果然是数据 ...

  5. Prompt实战优化

    1.概述 在深度学习领域,Prompt(提示语)被广泛应用于自然语言处理任务中,如文本生成.机器翻译和问答系统等.Prompt的设计对模型的性能和生成结果有着重要的影响,因此在实际应用中合理而有效地利 ...

  6. vs2019系统内置方法无提示

    有个同事问我为什么他的vs编写C#代码,对于引用System.dll中的方法,鼠标移上去没有方法的使用说明或接口注释,具体可以看下面的截图,而我绝大多数情况下是使用Rider开发,并没有遇到这个问题, ...

  7. 从零开始配置 vim(9)——初始配置

    虽然本系列文章叫做从0开始配置vim,似乎我们从一开始就要写vimrc配置文件,但是我们并没有这么做.我们先经过几篇文章了解了下面的几个内容 如何设置vim属性,从而改变vim的特征 配置快捷键,以提 ...

  8. 佳翼M2X16 PCIE4.0X16转4盘M.2NVME固态硬盘 - 我的硬件配置

  9. spring boot jar混淆加密

    最近在做一个智能床垫的机构版项目,客户要求部署到客户那边要做代码混淆防止代码被反编译. 一:在需要加密的jar的pom.xml文件添加依赖 <!-- 设置 jitpack.io 仓库 --> ...

  10. Python脚本之将一个文件夹划分多个文件夹和批量创建文件夹

    import os import shutil # 要移出的文件路径 path = r"C:\old_dir" # 新创建多个文件夹的路径 new_path = r"C: ...