使用命令行打包 nuget 包

时间:2022-01-22 14:47:42

对于那些不打算涉及这么复杂而又想制作自己的 nuget 包的园友们,我是推荐使用 Nuget Package Explorer 来制作的。关于这个图形化的 nuget 包管理软件的使用,博客园内有相关的文章,大家可以搜索看看。

好,回归正题。但是我们都知道,图形化最大的问题就是自动化不高

使用命令行打包 nuget 包

这是我其中的一个 nuget 包,可以看见里面的文件还是比较多的,那么我每一次重新编译,需要发布新版本的时候,就得把里面大部分的文件都替换成新的文件。每次都一个一个的替换,烦啊。而且有时候还得担心有没有替换少了。那么自动化打包肯定是值得研究研究一番了。

在 nuget 官网上面我们可以找到一篇关于如何创建 nuget 包的教程:https://docs.nuget.org/Create/Creating-and-Publishing-a-Package

使用命令行打包 nuget 包

那么我们先下载这个命令行工具下来。

然后准备我们需要打包的文件(就是 dll 之类的东西)。

看了下文档,说是支持读取直接 csproj 文件打包,那我们先试一下吧,毕竟程序员的准则就是能简单就简单,能懒就懒。

这里我的项目结构是这样的:

使用命令行打包 nuget 包

然后我们运行 cmd 并输入命令

使用命令行打包 nuget 包

报了个错,重新生成一下项目吧,再次运行。

使用命令行打包 nuget 包

好像成了,看看目录。

使用命令行打包 nuget 包

使用命令行打包 nuget 包

但是这 dll 所属的分类,错了吧,我建的可是 Win10 应用程序的 dll。。。

既然 csproj 方案不行的话,我们继续看文档。看见有一个通过描述 nuget 包的方案:https://docs.nuget.org/Create/Creating-and-Publishing-a-Package#create-the-manifest

要建立这么一个描述文件也很简单,跑个命令

使用命令行打包 nuget 包

使用命令行打包 nuget 包

然后我们用文本编辑器来打开这个新的 Package.nuspec 文件。

使用命令行打包 nuget 包

可以看见是一个 xml 文件,然后修改下里面的属性就可以了。

再次执行。

使用命令行打包 nuget 包

有警告,简单看了下,是说不知道应该打包哪些文件。

那么继续找找文档,最后我们可以发现这个。

使用命令行打包 nuget 包

修改下我们的 nuspec 文件。

使用命令行打包 nuget 包

新加上红色部分,也就是将这个 dll 打包进 nuget 包的 lib\uap10.0\ 这个目录里面。

再次执行打包命令。

使用命令行打包 nuget 包

这次没警告了。

而且包的结构也没问题。

使用命令行打包 nuget 包

那么只要编写好 nuspec 里面的 files 节点的话,以后执行 nuget pack XX.nuspec 这个命令的话,就能够简单地生成 nuget 包了。

为了再懒一点,我们将上面这个命令弄成批处理。

%~dp0nuget.exe pack %~dp0Package.nuspec -OutputDirectory %~dp0

%~dp0 这个是获取当前正在执行的这个 bat 文件的所在目录。

那么最后就变成这样:

使用命令行打包 nuget 包

确保这三个文件放在一起,然后执行 package.bat 就能在当前目录生成 nuget 包了。

接下来我们就可以发布 nuget 包了,用命令也行,但保障一点,我还是用 GUI 工具来发布(毕竟发布前再检查一次还是有必要的)。

用 Nuget Package Explorer 打开上面生成的那个 nuget 包。

使用命令行打包 nuget 包

按这里就可以了。

注意:一旦发布,nuget 上的包是不能够删除的!!只能隐藏,因此,请确保无误再发布。

这里是分割线使用命令行打包 nuget 包

到最后一步我们已经使用批处理来做了,那么可以再玩的花样就多去了,例如用 PowerShell 来自动化包的版本。在项目的 AssemblyInfo.cs 有一个 AssemblyVersion 的 Attribute,然后我们就可以用 PowerShell 来先读取这个版本号,然后修改 nuspec 文件里的 version 节点,再生成包。其实我现在就已经是这么做了使用命令行打包 nuget 包,鉴于我 PowerShell 也没学过,那段代码就不放出来丢脸了使用命令行打包 nuget 包。大家可以发散思维,期望在 nuget 上能看见园友发布的包包使用命令行打包 nuget 包