Hello 大家好, 我是 TANZAME, 我们又见面了.
NuGet 是什么这里就不再重复啰嗦, 园子里一搜一大把. 今天要跟大家分享的是, 在日常开发过程中如何统一管理我们的包, 如何通过批处理脚本生成包并自动上传到 NuGet. 在实际项目开发过程中我们要上传自己的包, 一般的步骤都是: nuget spec => nuget pack => nuget push, 一个包都要至少重复三个动作, 如果有 N 个包那就要重复 N*3 次, 想想都不能忍, 所以便有了今天的分享主题.
生成目录
既然是统一管理, 生成的包自然是放在同一个文件夹, 而不是分散在各个 .proj 目录里. 这里我们在解决方案所在目录新建一个目录, 这样做的目的是方便 bat 脚本找到解决方案下面的子项目. 比如我这里新建的是 .nuget 这个目录, 需要注意的是如果目录名称有特殊字符的话不能直接右键新建, 需要用命令提示符, 直接在解决方案所在目录使用快捷键 SHIFT + 右键就能直接打开命令提示符, 这样可以省去一大堆 cd 的操作.
下载 NuGet
到 NuGet 官网下载命令行接口(CLI).nuget.exe 提供了完整的 nuget 功能, 可用于安装, 创建, 发布和管理包, 而无需对项目文件进行任何更改.
请访问 https://nuget.org/downloads , 并选择 NuGet 3.3 或更高版本(2.8.6 与 Mono 不兼容). 始终建议使用最新版. 若要将包发布到 nuget.org, 版本至少必须是 4.1.0.
每次下载都直接下载 nuget.exe 文件. 让浏览器将文件保存到选定文件夹. 此文件不 是安装程序; 如果直接在浏览器中运行, 就不会看到任何内容.
将文件夹添加到 nuget.exe 中放置 PATH 环境变量的位置, 这样就可以从任意位置使用 CLI 工具. 这里我们把它放在上一步新建的 .nuget 文件夹下面, 并设置 PATH 环境变量.
生成清单
.nuspec 文件是包含包元数据的 xml 清单, 此清单同时用于生成包以及为使用者提供信息. 这个清单文件我们只需要生成一次, 以后都不需要再重新生成. .net Core 和使用 sdk 特性. NET Standard 项目不需要 .nuspec 文件, 如果是. net Core 和使用 sdk 特性. NET Standard 项目则忽略此步骤. 转到项目所在目录, SHIFT + 右键 调出命令提示符, 输入 nuget spec 命令即可生成我们所需要的包元数据清单.
将这个清单文件剪切到第一步新建的 .nuget 文件夹, 剪切过去后项目下面就不会凭空多出一个文件, 看着清爽多了. 然后做一下调整填入我们自己项目的相关信息, 比如像下面这样:
- <?xml version="1.0" encoding="utf-8"?>
- <package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
- <metadata>
- <id>TZM.XFramework</id>
- <version>$version$</version>
- <title>$title$</title>
- <authors>$author$</authors>
- <owners>$author$</owners>
- <license type="expression">Apache-2.0</license>
- <projectUrl>https://github.com/TANZAME/TZM.XFramework</projectUrl>
- <iconUrl>http://go.microsoft.com/fwlink/?LinkID=386613</iconUrl>
- <description>TZM.XFramework is a lightweight and high performance object-relational mapper for .NET use the original Entity Framework API.</description>
- <copyright>Copyright 2019</copyright>
- <tags>.NET SqlServer MSSQL Database Data O/RM ADO.NET</tags>
- <repository type="git" url="https://github.com/TANZAME/TZM.XFramework" />
- <dependencies />
- <frameworkAssemblies>
- <frameworkAssembly assemblyName="System.Data"/>
- <frameworkAssembly assemblyName="System.ComponentModel.DataAnnotations"/>
- <frameworkAssembly assemblyName="System.Net.Http"/>
- </frameworkAssemblies>
- </metadata>
- </package>
编写脚本
在第一步新建的文件夹里新建一个 bat 文件, 重命名为 package.bat, 接下来编写我们的自动脚本. 完整 bat 脚本戳这 里, 直接上代码片段.
这里我设置 nuget pack 包属性为 Release, 并且不自动生成, 所以需要先在 Release 模式下编译完成再运行脚本. 加上 -Build 参数的话输出的信息太多看得贼难受, 这里把它去掉, 我们自己手动编译.
填充 api_key. 去 nuget 官网 登录自己的帐号并创建一个 key, 复制粘贴到 api_key 变量.
注意 .net framework 项目 (fx) 和 .net core 项目使用的命令不一样
至此我们所有的准备步骤都已完成, 双击 package.bat 运行脚本, 解放双手.
- @echo off
- set api_key=xxxxxxlef2j57rw4q26qcrvycvznyvcurgfxbzxxxxxxxx
- set source_api_uri=https://api.nuget.org/v3/index.json
- set startup_dir=%~dp0
- cd ..\
- set startup_dir=%cd%
- cd .nuget
:: 打包 TZM.XFramework -Build
- echo pack TZM.XFramework
- copy TZM.XFramework.nuspec %startup_dir%\net45\TZM.XFramework
- nuget pack %startup_dir%\net45\TZM.XFramework\TZM.XFramework.csproj -Properties Configuration=Release
- del %startup_dir%\net45\TZM.XFramework\TZM.XFramework.nuspec
- echo=
:: 打包 TZM.XFrameworkCore
- echo pack TZM.XFrameworkCore
- dotnet pack --no-build --configuration Release --output %startup_dir%\.nuget\ %startup_dir%\netcore\TZM.XFrameworkCore\TZM.XFrameworkCore.csproj
:: 批量推送包
- for /R %cd% %%f in (*.nupkg) do (
- echo=
- dotnet nuget push %%f -k %api_key% -s %source_api_uri%
- )
- echo=
- pause
最后贴一张最终运行的效果图:
总结
通过这个脚本, 我们可以在一个文件夹里统一管理我们的包, 做到一键生成, 上传同时保持项目文件的清爽, 嗯简直不要太方便 ~..~
参考资料: https://docs.microsoft.com/zh-cn/nuget/
技术交流群: 816425449
来源: https://www.cnblogs.com/yiting/p/11886327.html