背景:

在项目中, 通常会拆分成核心库(Core)和应用(App)两个部分。核心库由专人维护, 不同的App是不同的团队,但都引用了核心库。当核心库需要升级更新时,有的应用会更新,有的不会——可能是没必要,可能是应用本身更新、部署限制条件多。因此,会造成多版本并存的情况。

使用NuGet来做多版本的管理和分发是一件普遍接收的事情。Visual Studio 可以直接将csproj项目制作成一个NuGet包, 但是只能包含这个项目本身编译的dll;如果当前项目还引用了其他的csproj项目,这些引用并没有能包含在Nuget包中。

因此,下面我将要解决两个问题:

1) 多个项目生成一个Nuget包

2) 自动递增Nuget包的版本问题

技巧:

一,将多个csproj项目生成一个nuget包。

我的思路是这样的,为了减少操作上的麻烦, 我建了一个空的项目Z, 然后这个项目引用了所有其他需要打入包中的类库项目A, B, C…, 当Z项目Build的时候, 就会自动编译A, B, C项目,并且将类库生成到bin目录中。

其次, 使用*.nuspec文件,来描述包中的内容。

<?xml version="1.0" encoding="utf-8"?>

<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">

  <metadata>

    <id>MyPack.Foundation</id>

    <version>1.0.11</version>

    <authors> MyPack </authors>

    <owners> MyPack </owners>

    <requireLicenseAcceptance>false</requireLicenseAcceptance>

    <description>[RedPI类库] RedPI.Foundation, 微服务开发框架</description>

    <dependencies>

      <group targetFramework=".NETStandard2.0">

        <dependency id="AutoMapper" version="10.0.0" />

        <dependency id="Jaeger" version="0.3.7" />

      </group>

    </dependencies>

  </metadata>

  <files>

    <file src=".\netstandard2.0\Company.*.dll" target="lib\netstandard2.0" />

    <file src=".\netstandard2.0\Company.*.pdb" target="lib\netstandard2.0" />  

  </files>

</package>

Nuspec文件上面描述了包的版本、作者等信息,下面描述了包的内容。具体格式不在此赘述,感兴趣的看官可以自行查阅官网。在这里我重点说明下dependency和file。

Dependency是说整个nuget包的依赖,也就是包中所有lib库项目的依赖项的合集。这个很好找, 我的做法就是打开每个csproj文件, 把里面的PackageReference内容拿出来,换下格式就好—— 既有依赖的包名称, 也有版本号。

  <ItemGroup>

    <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />

    <PackageReference Include="System.ComponentModel.Annotations" Version="5.0.0" />

  </ItemGroup>

File是包的内容文件,使用相对路径,支持使用“*”匹配多个文件。建议项目的类库使用相同的名称前缀, 这样一行描述就够用了。 而且未来如果有新的类库加入, 不需要更新此处。

然后就可以使用Nuget.exe命令进行打包了:

nuget pack %nuspec% -version %VER% -Symbols -OutputDirectory %rootPath%

其中%nuspec% 就是我们刚才提到的nuspec文件,

%VER% 是包的版本号,这个接下来我们看看怎么做自动递增

%rootPath% 是本地包文件存放的位置。

二,自动递增包的版本号

这个有两种做法,一是先查后增, 二是在CI(持续集成)里搭配BuildNumber实现。后者是我们现在项目中的做法,也比较容易实现。接下来我主要介绍下“先查后增”的做法。

一般项目组要发布自己的Nuget包的话, 都会先搭建自己的Nuget服务器。如果使用Azure Devops Server的话,可以使用其中的Artifact作为自建包源;或者使用Nuget.Server包快速搭建一个自己的asp.net的Nuget服务器。然后可以使用nuget.exe list 指令进行版本查询。具体的过程脚本描述如下:

$addr = 'http://[your nuget server address]/nuget'

$pack = 'jquery'  # package name , eg. jquery
#$pack = $(pack) $currentVer = nuget list $pack -source $addr
# $currentVer = nuget list packageid:$pack -source nuget.org # # $currentVer = 'jquery 3.5.1.5'
write-host "Current Version:$currentVer" $matchs=$currentVer| select-string -AllMatches "[\w.]+ ([\d+.]+)(\d)[-pre]?" # $matchs.Matches[0].Groups[1].Captures[0].Value
# $matchs.Matches[0].Groups[2].Captures[0].Value $p = $matchs.Matches[0].Groups[1].Captures[0].Value
$n = 1+ $matchs.Matches[0].Groups[2].Captures[0].Value $newVer = "$p$n"

其中使用了正则匹配来找到版本号的最小段,然后递增即可。

补充一点, 在将包发布到服务器上之前,可以先在本地试试效果,也即将nupkg文件复制到local的目录中, 该目录可以作为nuget源进行引用。

最后, 使用nuget.exe
push 将包发布到服务器上

nuget push $nupkg -ApiKey {pwd} -Source $addr

总结:

包的使用在项目团队中很重要, 如果版本管理不好,容易招惹众怒,要考虑的事情还是挺多的。上面主要介绍了两个技巧,一个是将多个项目打成一个包,另一个是自动获取并递增版本号,希望能对各位看官有所帮助。

自定义Nuget包的技巧一二的更多相关文章

  1. 搭建自己的NuGet服务器,上传自定义NuGet包

    第一步搭建NuGet服务器 创建空Web项目 安装Nuget服务,目前最新版本2.8.2 安装完成,会自动生产服务,出现如下界面 发布该网站,并部署至IIS 将.nupkg文件发布至网站的Packag ...

  2. 6.如何使用官方提供的nuget包实现cookie登陆

    "Microsoft.AspNetCore.Authentication.Cookies": "1.0.0", 这里需要用到的是这个nuget包 public ...

  3. [2016-07-15]nuget包管理器控制台下的powershell脚本介绍

    博客有阵子没打理了,今天刚恢复样式,但是标题还是不太正常,总算能凑合看看. 回到正题,最近为了能在VS的程序包管理器控制台上能方便的自定义ps脚本去调整project的package,就开始看powe ...

  4. 发布 Rafy .NET Standard 版本 Nuget 包

    去年年中,Rafy 框架的源码就已经支持了 Net Standard 2.0 版本.其开源代码也已经上传到 Github 中:https://github.com/zgynhqf/rafy/tree/ ...

  5. 基于.net core实现项目自动编译、并生成nuget包

    近期想对自己的项目增加自动编译并生成nuget包,网上资料不少.但总还有迷糊的时候.首先:此解决方案包含多种版本的项目,如:有编译必须是x86平台,以及还有传统的.net foramework项目,以 ...

  6. C# NuGet包管理命令

    NuGet Package Manager Console 内置于 Visual Studio 在 Windows 2012 和更高版本. (不包含在 Visual Studio 用于 Mac 或 V ...

  7. 自动将 NuGet 包的引用方式从 packages.config 升级为 PackageReference

    在前段时间我写了一篇迁移 csproj 格式的博客 将 WPF.UWP 以及其他各种类型的旧样式的 csproj 文件迁移成新样式的 csproj 文件,不过全过程是手工进行的,而且到最后处理 XAM ...

  8. 开发.NET Core NuGet包并实现CI/CD

    实际开发中我们需要对一些公共类库进行开发,并基于Jenkins进行CI/CD(CI:持续集成,CD:持续部署),其他项目通过NuGet引用.上文讲述了如何搭建本地NuGet服务器并发布NuGet包,这 ...

  9. 基于 Vue.js 之 iView UI 框架非工程化实践记要 使用 Newtonsoft.Json 操作 JSON 字符串 基于.net core实现项目自动编译、并生成nuget包 webpack + vue 在dev和production模式下的小小区别 这样入门asp.net core 之 静态文件 这样入门asp.net core,如何

    基于 Vue.js 之 iView UI 框架非工程化实践记要   像我们平日里做惯了 Java 或者 .NET 这种后端程序员,对于前端的认识还常常停留在 jQuery 时代,包括其插件在需要时就引 ...

随机推荐

  1. Azure DevOps(一)利用Azure DevOps Pipeline 构建应用程序镜像到AWS ECR

    一,引言 最近项目上让开始学习AWS,作为一名合格的开发人员,当然也是学会利用Azure DevOps Pipeline 将应用程序部署到 AWS ECS(完全托管的容器编排服务).我们要学会将应用程 ...

  2. Linux下ftp搭建

    FTP服务器搭建教程: https://blog.csdn.net/plssmile/article/details/17061271 https://blog.csdn.net/guofengdid ...

  3. 一文详解 Linux 系统常用监控工一文详解 Linux 系统常用监控工具(top,htop,iotop,iftop)具(top,htop,iotop,iftop)

    一文详解 Linux 系统常用监控工具(top,htop,iotop,iftop)     概 述 本文主要记录一下 Linux 系统上一些常用的系统监控工具,非常好用.正所谓磨刀不误砍柴工,花点时间 ...

  4. ltp循环跑

    e]# cat r3.sh#!/bin/bashi=1for ((; i<=1000; i++))do/opt/ltp/runltp -s fmtmsg01 -p -l -t -l /home/ ...

  5. Python基础 小白[7天]入门笔记

    笔记来源 Day-1 基础知识(注释.输入.输出.循环.数据类型.随机数) #-*- codeing = utf-8 -*- #@Time : 2020/7/11 11:38 #@Author : H ...

  6. IDEA 2019.2.4 破解安装教程

    将下载的 IDEA 压缩包解压,找到 idealIU-2019.2.4.exe 安装文件,然后双击进行安装 安装完后不要运行,打开解压包中破解补丁与激活码文件夹,找到 jetbrains-agent. ...

  7. 【C++】禁用/启用笔记本键盘工具(含源码)

    目录 前言 简单介绍注册表 (1)根键 (2)子键 (3)键值项 操作注册表的几个API函数 (1)打开一个键 (2)查询某一个键值 (3)设置一个键值 (4)新建指定键 (5)删除注册表指定键下的值 ...

  8. 案例分享:Qt modbus485调试工具(读写Byte、Int、DInt、Real、DReal)(当前v1.3.0)

    前言   西门子PLC.台达PLC.法兰克机床等等多年以前玩得比较多,有tcp/ip通讯也有modbus通讯,modbus又分为网络,485,232等.  医疗项目,焊接机器人项目,工控机床项目,数控 ...

  9. 深入剖析 MySQL 自增锁

    之前的文章把 InnoDB 中的所有的锁都介绍了一下,包括意向锁.记录锁...自增锁巴拉巴拉的.但是后面我自己回过头去看的时候发现,对自增锁的介绍居然才短短的一段. 其实自增锁(AUTO-INC Lo ...

  10. [Django高级之中间件、csrf跨站请求伪造]

    [Django高级之中间件.csrf跨站请求伪造] Django中间件 什么是中间件? Middleware is a framework of hooks into Django's request ...