构建现代的 .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 中一个有力的功能就是任务功能,我们可以通过执行任务来实现同样的效果。

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脚本,保存的时候取一个友好的名字。

3. 结语

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

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

Nuget 多平台多目标快速自动打包的更多相关文章

  1. 发布nuget包的正确姿势---cicd自动打包发布nuget包

    最轻便的发布nuget包方式,方便cicd自动打包发布nuget包 首先新建项目 项目名随便取,这里就叫它GuiH.ClassLibrary 默认即可,需要改目标版本时,等创建好再改 项目创建好了 随 ...

  2. SNF开发平台WinForm之十一-程序打包-SNF快速开发平台3.3-Spring.Net.Framework

    原来我们用的是微软自带的打包工具去打包,但感觉好像也是第三方做的打包并且很是麻烦,还有时不成功报错.那综合考虑就找一个简单实用的打包工具吧,就找到了NSIS这个.具体打包步骤如下: 1.安装NSIS ...

  3. windows右键菜单自动打包发布nuget,没有CI/CD一样方便!

    构建现代的 .Net 应用离不开 Nuget 的支持,而快速打包 Nuget 成了提高生产率的有效方法.没有CI/CD?来试试使用windows右键菜单吧 先看右键效果图 有时候我们可能没有CI/CD ...

  4. 基于python脚本,实现Unity全平台的自动打包

    转载请标明出处:http://www.cnblogs.com/zblade/ 0. 概述 本文主要针对项目中自动打包过程进行调研,实现用python脚本来打出win/android/ios三个平台下的 ...

  5. webpack快速入门——实战技巧:watch的正确使用方法,webpack自动打包

    随着项目大了,后端与前端联调,我们不需要每一次都去打包,这样特别麻烦,我们希望的场景是,每次按保存键,webpack自动为我们打包,这个工具就是watch! 因为watch是webpack自带的插件, ...

  6. Github自动打包并推送Nuget版本

    如何将自己的类库,自动打包并自动发布到Nuget? 1. 项目csproject属性修改 新建一个项目GitToNugetPackageTest 不用添加任何类,我们修改csproject属性. 替换 ...

  7. 使用Jenkins进行Android自动打包,自定义版本号等信息【转】

    之前App在提交测试和最终部署的过程中App打包一直是由开发人员来完成的,由于项目比较大, 再加上Android打包本身就比较慢,所以每次打包还是很耗时的.并且按照严格的研发流程来讲,开发人员应该只负 ...

  8. [原] Jenkins Android 自动打包配置

    一.Jenkins自动打包配置 目标:1. 自动打包:2. 自动上传:3. 友好下载 1. Jenkins简介 Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作. 减少重复劳 ...

  9. iOS开发进阶 - 使用shell脚本自动打包上传到fir.im上-b

    用fir.im测试已经好长时间了,感觉每次打包上传都很麻烦,想着是不是可以用脚本自动打包,在网上搜了一下确实有,下面总结一下如何使用脚本自动打包上传到fir.im,以及打包过程中遇到的问题和解决办法 ...

随机推荐

  1. Docker最全教程——MongoDB容器化(十二)

    MongoDB容器化 MongoDB是一个免费的.开源的.跨平台分布式面向文档存储的数据库,由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和 ...

  2. java jdk 8反编译工具JD-GUI、procyon-decompiler、luyten、crf下载使用简介

    本文对常用的反编译工具进行简单介绍 JD-GUI.procyon-decompiler.luyten.crf   反编译工具分类 JD-GUI JDK7以及之前可以使用   JD-GUI,如果版本&g ...

  3. 第一册:Lesson 123.

    原文:A trip to Australia. question:Who is the man with the beard? Look ,Scott.This is a photograph I t ...

  4. [Flashback]开启数据库闪回数据库功能

    Flashback是Oracle中一个重要的功能,想要使用闪回数据库功能,需要将数据库置于闪回数据库的状态. 1.检查数据库是否开启归档状态 SQL> archive log list; Dat ...

  5. [TCP/IP] 计算机网络性能指标

    速率:连接在计算机网络上的主机在数字信道上传输数据位数的速率单位是 b/s kb/s mb/s gb/s带宽:数字信道所能传输的最高数据率 查看我的网卡是144Mbps吞吐量:单位时间内通过某个网络的 ...

  6. Vue基础知识

    Vue特性: 双向数据绑定 通过 指令 扩展了 HTML,通过 表达式 绑定数据到 HTML 解耦视图与数据 可复用组件 虚拟DOM -> 对象 M-V-VM 数据驱动视图 Vue声明周期: b ...

  7. 第十一课 CSS介绍与font字体 css学习1

    一.CSS样式规则 1.基本结构 <html> <head> <style> h1{ color: orange; } </style> </he ...

  8. 开源GIS知识

    ---恢复内容开始--- 2.1.3组件层 数据库组件层按照功能可分为两类:数据管理组件和分析组件. 2.1.3.1数据管理组件 (1)GDAL GDAL(http://www.gdal.org/)是 ...

  9. vue input输入框长度限制

    今天在开发登录页时,需要设置登录输入框的长度,输入类型为number <input type="number" maxlength="11" placeh ...

  10. 人脸识别ArcFace C#DEMO 开发应用全过程

    手上有一个项目,需要检验使用本程序的,是否本人!因为在程序使用前,我们都已经做过头像现场采集,所以源头呢是不成问题的,那么人脸检测,人脸比对,怎么办呢?度娘了下,目前流行的几个人脸检测,人脸比对核心, ...