首页 技术 正文
技术 2022年11月15日
0 收藏 310 点赞 4,876 浏览 2533 个字

Nuget是什么不用多说,大家应该也没少用过Nuget, 不少人也应该使用过工具打Nuget包,接下来先一步步说明如何使用脚本完成Nuget一键打包

Nuget一键打包

配置Nuget环境

调用如下图,说明已经配置好

生成Nuget包必须包含的Nuspec文件

nuget spec ConsoleApp1

生成的nuspec文件如下,其中ConsoleApp1这个Id表示Nuget Package的唯一标识

下图是我本地文件夹包含的文件

有些文件其实并不是我们想要打进nuget包里的,这时候我们可以编辑Nuspec文件,指定要包含的文件

可以参考官方文档

nuspec文件描述:https://docs.microsoft.com/zh-cn/nuget/reference/nuspec

nuget package文件目录:https://docs.microsoft.com/zh-cn/nuget/create-packages/creating-a-package 文中写明了Nuget安装是对不同的文件夹会有不同的操作

Nuget生成package

nuget pack ConsoleApp1.nuspec -Version 1.0.0.0

生成对应的package文件 ConsoleApp1.1.0.0.0.nupkg

大家可以直接将nupkg文件解压缩,看看里面具体的文件目录

Nuget上传

nuget push ConsoleApp1.*.nupkg -Source YourSourceUrl -ApiKey YourApiKey

其中:

  • YourSourceUrl 指nuget服务器地址
  • YourApiKey 指通过服务器校验的密钥

Nuget包删除

nuget delete ConsoleApp1 1.0.0.0 -Source YourSourceUrl -ApiKey YourApiKey

完整的Nuget一键打包流程

现在软件开发离不开代码版本管理,所以nuget一键打包也需要和代码版本管理结合,这里以git管理举例

@echo off
set AssemblyName=ConsoleApp1
set ApiKey=YourApiKey
set SourceUrl=YourSourceUrlecho git tag (需要手动输入tag版本号以及注释)
set /p version=请输入版本号(Tag名):
set /p comment=请输入注释(Tag注释):echo git tag -a "%version%" -m "%comment%"
git tag -a "%version%" -m "%comment%"
git push origin "%version%"if %errorlevel% NEQ 0 exit
nuget pack %AssemblyName%.nuspec -Version %version%
nuget push %AssemblyName%.*.nupkg -Source %SourceUrl% -ApiKey %ApiKey%
del %AssemblyName%.*.nupkg /F /Q
pause

上述流程介绍了一个比较简单的打包流程,Nuget Package也是相对简单,但是往往实际情况要复杂的多。


现在问题来了,众所周知,.NET可以调用C++的dll(实际上.NET的底层都是调用WindowsApi),当你的动态链接库依赖一个或一组C++的dll的时候怎么办?如何让别人在引用你的动态链接库的时候,只需要Nuget安装一下就行?

方法一:使用Nuget Package中的ContentFiles文件夹

ContentFiles文件夹在安装的时候没有任何行为

如何放入ContentFiles文件夹中

编辑Nuspec文件,在Files节点中指定

如何将ContentFiles中的文件输出到编译输出目录呢

可以自行添加编译后指令将文件复制到输出目录中,以达到使用的目的

但是很显然,此方法并不是很完美,难道每个引用该package的人都要写一遍指令来复制文件吗?

方法二:使用Nuget Package中的Content文件夹

Content文件夹对应的行为是内容复制到项目根目录。 将“内容”文件夹视为最终使用包的目标应用程序的根目录

用更直白的话语解释一下:放在content文件夹的内容在安装的时候,就像你手动在项目中添加文件一样

如何放入Content文件夹

同ContentFiles一样,这里就不再赘述

如何将Content中的文件输出到编译输出目录呢

  • 同ContentFiles一样写指令复制文件
  • 因Content的文件会被引入到项目中,可以设置文件的属性,修改输出的行为,但是每次已更新就得重新设置

    这种方法也不是很完美

方法三:使用Nuget Package中的Build文件夹+自定义的Targets文件

Nuget安装的时候将Build目录中的targets文件自动插入到项目中

如何放入Build文件夹中

下图是我的文件夹目录

其中components文件夹中包含了一组ConsoleApp1.dll依赖的C++组件

nuspec文件如下图

targets文件如下

最终打出来的包目录如下

这种方法只需要使用者直接引用nuget package即可,其他的均无需考虑,不管是依赖的是一个还是一组C++组件,不管是在根目录下还是包含子目录,都可以解决上面提到的问题。

实现的原理:nuget在安装package的时候,将Build目录中的targets文件直接导入到对应的project文件中,MSBuild执行的时候会将对应的文件输出到输出目录

这里重点提到一点便是

这个targets文件的名称必须在当前package的Id一样(非常重要)本文中都是ConsoleApp1

以上代码均为原创分享,若大家认为有不妥的地方,烦请留言指出,在下感激不尽

本文作者:hexuwsbg

出处:https://www.cnblogs.com/hexu0512/p/12880526.html

版权:本文采用「可附带出处转载」知识共享许可协议进行许可

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,031
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,520
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,368
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,148
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,781
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,861