你的位置:首页 > ASP.net教程

[ASP.net教程]使用命令行打包 nuget 包


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

 

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

QQ截图20151021183619

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

 

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

QQ截图20151021184741

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

 

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

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

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

QQ截图20151021185512

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

QQ截图20151021185839

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

QQ截图20151021185937

好像成了,看看目录。

QQ截图20151021192431

QQ截图20151021192516

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

 

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

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

QQ截图20151021192847

QQ截图20151021192857

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

QQ截图20151021193036

可以看见是一个

再次执行。

QQ截图20151021193538

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

 

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

QQ截图20151021193744

修改下我们的 nuspec 文件。

QQ截图20151021194102

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

再次执行打包命令。

QQ截图20151021194224

这次没警告了。

而且包的结构也没问题。

QQ截图20151021194328

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

 

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

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

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

那么最后就变成这样:

QQ截图20151021200418

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

 

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

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

QQ截图20151021201000

按这里就可以了。

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

 

这里是分割线QQ图片20150925222632

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