背景:

在项目中, 通常会拆分成核心库(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. nginx日志文件按天记录定时清理循环记录

    问题 nginx日志默认记录在一个文件access.log中,时间长了会导致日志文件特别大,甚至磁盘占满. 解决方案 使用以下方法,将access.log文件每天一个,然后清过15天以前的文件. 方法 ...

  2. mysql unique key

    create table b1(id int,name char unique)这样name字段就唯一了 或者create table b1(id int,name char,unique(id),u ...

  3. SQLFlow——一个强大的可视化SQL关系分析工具

    SQLFlow 摘要 本文主要介绍SQLFlow是什么,以及它的功能及使用场景 SQLFlow是什么 SQLFlow是一个可视化的在线处理SQL对象依赖关系的工具,只需要上传你的SQL脚本,它可以自动 ...

  4. [Java] 数据分析 -- 回归分析

    线性回归 需求:从文件读取数据对,计算回归函数及系数 实现1:commons.math的SimpleRegression,定义函数getData从文件读取数据返回SimpleRegression类 1 ...

  5. 【转载】linux 安装 中文输入法 Fcitx 手动

    在 Linux(测试版)中安装中文输入法 由于一些原因,目前在 Linux(测试版)中无法调用系统的输入法,故需要安装第三方输入法为 Linux(测试版)中的应用提供中文输入支持.本文档旨在介绍第三方 ...

  6. linux服务器默认使用中文字符集zh_CN.UTF-8

    linux服务器默认使用中文字符集zh_CN.UTF-8 一.问题描述和相关概念 linux服务器的字符集设置可能影响到网站页面出现 "???" 等问号乱码,还有可能导致文件中的汉 ...

  7. Linux ln命令:在文件之间建立链接(硬链接和软链接)详解版1

    Linux ln命令:在文件之间建立链接(硬链接和软链接)详解版 < Linux创建文件及修改文件时间戳(touch命令)Linux复制文件和目录(cp命令) > <Linux就该这 ...

  8. ./g1.sh q w e r 5个参数 bash命令 获取 命令实际的参数 shell文件名称$0 第一个参数$1第2个参数$2 最后一个参数$#;参数个数$#个;所有的参数列出来$* 返回值$? 正确0 失败1

    # ./g1.sh q w e r t./g1.sh q w e r5个参数number is q w e r t[root@localhost get]# cat g1.sh#!/bin/bash# ...

  9. IT菜鸟之虚拟机VMware的安装

    老师说过,如果想学好Linux,最好不要在实体机上安装Linux,因为学习需要经常折腾,在实体机上做实验,出现故障就要重新安装,这样绝大多数时间都会浪费在安装上. 这时我们需要一个工具,它就是虚拟机. ...

  10. F5 BIG-IQ 8.0 发布 - 借助一个统一的管理平台,管理您的所有 BIG-IP 设备和服务

    针对完整可见性和控制的 BIG-IQ 集中式管理 BIG-IP 设备和服务的端到端控制 高效管理(编排.可见性和合规性)依赖于跨本地和云部署中始终如一的应用服务和安全策略.利用独立统一的管理平台实现对 ...