欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

自定义Nuget包的技巧一二

程序员文章站 2022-05-18 14:23:56
包的使用在项目团队中很重要, 如果版本管理不好,容易招惹众怒,要考虑的事情还是挺多的。本文主要介绍了两个技巧,一个是将多个项目打成一个包,另一个是自动获取并递增版本号 ......

背景:

在项目中, 通常会拆分成核心库(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

 

 

总结:

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