Nuget 多平台多目标快速自动打包

简介: 构建现代的 .Net 应用离不开 Nuget 的支持,而快速打包 Nuget 成了提高生产率的有效方法。1. 前置条件为了实现 Nuget 的快速打包,我们需要先解决一些前置依赖,无论是 .Net Framework、Mono 或者 .Net Standard(.Net Core),我们都需要先编译通过,然后再打包成 Nuget 包,最后再发布到 Nuget 服务器上。

构建现代的 .Net 应用离不开 Nuget 的支持,而快速打包 Nuget 成了提高生产率的有效方法。

1. 前置条件

为了实现 Nuget 的快速打包,我们需要先解决一些前置依赖,无论是 .Net Framework、Mono 或者 .Net Standard(.Net Core),我们都需要先编译通过,然后再打包成 Nuget 包,最后再发布到 Nuget 服务器上。

相关目标 (支持平台以及依赖):

  • .Net Framework (仅 Windows) : MSBuild.exe、Nuget.exe
  • Mono (跨平台) : mono、xbuild、Nuget.exe
  • .Net Standard (跨平台) : dotnet sdk

由于大多数人还是在 Windows 上开发,所以我下面的教程会以 Windows 为标准,并旁敲侧推到其他平台。

2. 快速打包示例

2.1 Visual Studio 中快速打包

在 Visual Studio 中要实现 Nuget 的快速打包主要是借助 Visual Studio 自带的外部工具。在实战之前,我们要确保依赖都满足了。因为已经安装了 Visual Studio ,所以默认是已经安装了 MSBuild 和 Nuget 了。

其次,为了让自动打包的脚本的字符串尽量节省空间,我们会尽量将对应的依赖加到系统环境变量的 Path 路径中。一般而言,Msbuild 是在 Visual Studio 安装目录下的 Msbuild 目录中,如下图所示,在我本机地址是 "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\amd64" ,Nuget 最好是另外放置,例如我就把它放到了 "D:\tools" 目录中。

系统环境变量

如果你足够细心,可以发现安装完 .Net Core 的 SDK 后,默认已经加到了系统的环境变量中了( Mono 也是如此)。

然后我们使用 Visual Studio 打开对应的项目,点击菜单栏中 " 工具 - 外部工具 ",添加我们自定义的自动打包发布脚本。

外部工具

如上图所示,这里使用的是 powershell.exe,如果提示找不到 powershell.exe,同样是将路径添加到系统环境变量的 path 中。至于参数,可以是一个ps脚本文件,也可以是执行脚本语句,在这里使用脚本语句。初始目录选中 "目标目录" 或者 "项目目录"都可以。

从上图中,可以看出区分了目标构建,这里分布展示 .Net Framework 和 .Net Standard 的构建脚本,其中 .Net Framework 类似这样:

del *.nupkg ; $roj=dir *.csproj ;msbuild $roj; nuget pack $roj ; $nupkg= dir *.nupkg; nuget.exe push $nupkg nugetpassword -Source http://192.168.9.1/nuget

而 .Net Standard 则是:

del *.nupkg ; dotnet build ;dotnet pack --output  $pwd;$nupkg= dir *.nupkg; dotnet nuget push  $nupkg nugetpassword -Source http://192.168.9.1/nuget

至于运行在非 Windows 上的 Mono 则可能是:

rm *.nupkg ; $roj= *.csproj ;xbuild $roj; $ver= date -d yesterday +%Y%m%d%H%M;nuget pack $roj -Suffix $ver; $nupkg=  *.nupkg; mono nuget.exe push $nupkg nugetpassword -Source http://192.168.9.1/nuget

他们共同的特征都是先删除当前路径的 nupkg 的文件,然后编译、打包、发布。(如果你没有私有的Nuget服务器,可以参考我另外一篇文章)

在这个基础上可以做更多的扩展,比如发布测试版本,就在原来的基础上添加后缀,如:

del *.nupkg ; $roj=dir *.csproj ;msbuild $roj; $ver=\"beta-\"+(Get-Date).ToString(\"yyyyMMddHHmm\");nuget pack $roj -Suffix $ver; $nupkg= dir *.nupkg; nuget.exe push  $nupkg nugetpassword -Source http://192.168.9.1/nuget

编写好自定义的外部工具后,以后每次打包发包都可以按一下按钮就运行了。

2.2 VSCode

VSCode 是另外一个受人欢迎的代码编辑器,目前不支持 Visual Studio 中的外部工具功能 (如果有,请告诉我),也没有扩展支持直接发布 Nuget 包,但是这并不妨碍我们实现快速自动打包并发布 Nuget 包。

VSCode 中一个有力的功能就是任务功能,我们可以通过执行任务来实现同样的效果。
task.json

2.3 文件夹右键菜单

2.3.1 Windows 环境中示例

有时候我们可能需要脱离 ide 来执行脚本,这个时候文件夹右键菜单就显得十分高效了(可以多选文件夹发布)。

文件夹右键菜单

具体的操作是修改 windows 的注册表,具体可以参考windows 下如何修改右键菜单 一文。

修改注册表

如果你觉得麻烦,我这里有一个示范的注册表,修改其中Nuget push的参数为对应的Nuget服务器信息,另存为 nuget.push.reg,双击即可导入到系统,然后重启 windows 资源管理器的进程(就是我的电脑的进程)。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shell\Nuget]
@="Nuget发布"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shell\Nuget\command]
@="powershell.exe -noexit -command Set-Location '%V' ;powershell.exe  -c \"echo $pwd;del *.nupkg ;dotnet pack --output  $pwd;$nupkg= dir *.nupkg; dotnet nuget push $nupkg -k 123456 -s http://192.168.1.1;\""

如果提示找不到程序,需要把 powershell.exe 添加到系统环境变量的path中。

2.3.2 Mac 环境中示例

在 Mac 中实现同样的功能需要借助 Automator 的帮助,首先是添加一个服务,选择运行shell脚本,保存的时候取一个友好的名字。

Automator

文件夹效果

3. 结语

虽然本文着重讲了如何实现 Nuget 多平台多目标快速自动打包的小目标,但从几个示例当中就可以看到自动化脚本的威力。

我的博客即将入驻“云栖社区”,诚邀技术同仁一同入驻。



本文采用 知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议
转载请注明来源: 张蘅水
我在开发者头条中还会每日分享不错的技术文章,搜索 356194 即可查看
目录
相关文章
|
9月前
|
域名解析 网络协议 虚拟化
性能工具之JMeter模拟多IP地址访问
【4月更文挑战第2天】性能工具之JMeter模拟多IP地址访问
405 2
性能工具之JMeter模拟多IP地址访问
|
数据格式
用正则表达式校验手机号和邮箱
用正则表达式校验手机号和邮箱
868 0
|
存储 开发框架 .NET
使用.NET从零实现基于用户角色的访问权限控制
本文将介绍如何实现一个基于.NET RBAC 权限管理系统,如果您不想了解原理,可查看推送的另一篇文章关于[Sang.AspNetCore.RoleBasedAuthorization](https://www.nuget.org/packages/Sang.AspNetCore.RoleBasedAuthorization) 库是使用介绍,直接使用该库即可。
376 0
使用.NET从零实现基于用户角色的访问权限控制
|
存储 Unix Shell
ASCII 中的控制字符
Function/Control Code/Character in ASCII Version: 2011-02-15 Author: green-waste (at) 163.com 【什么是 Function Code 功能码或  Function Character 功能字符】 ASCII 字符集,大家都知道吧,最基本的包含了 128 个字符。
1887 0
|
网络协议 Unix Linux
从问题看本质:socket到底是什么?
原文:http://blog.csdn.net/yeyuangen/article/details/6799575 一、问题的引入——socket的引入是为了解决不同计算机间进程间通信的问题 1.socket与进程的关系 1).socket与进程间的关系:socket   用来让一个进程和其他的进程互通信息(IPC),而Socket接口是TCP/IP网络的API接口函数。
2066 0
LXJ
|
网络协议 安全 关系型数据库
PostgreSQL---用户权限管理
PostgreSQL---用户权限管理
LXJ
1810 0
PostgreSQL---用户权限管理
|
存储 小程序 anyproxy
通过anyproxy来抓取手机的https信息
最近有个小功能需要一些基础数据,找了一下在小程序上有发现,暂时还没找到他的网站,想着把这些数据爬一些下来做为基础数据使用的。本来还想着直接反编译小程序的,没想到微信变更了加密方式,以前反编译的路子走不通了。
通过anyproxy来抓取手机的https信息
|
网络协议 网络安全 网络架构
Netty 如何实现心跳机制与断线重连?
心跳机制 何为心跳 所谓心跳, 即在 TCP 长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, 通知对方自己还在线, 以确保 TCP 连接的有效性.
554 0
Netty 如何实现心跳机制与断线重连?

热门文章

最新文章