Nuget是什么不用多说,你们应该也没少用过Nuget, 很多人也应该使用过工具打Nuget包,接下来先一步步说明如何使用脚本完成Nuget一键打包html
调用以下图,说明已经配置好
git
nuget spec ConsoleApp1
服务器
生成的nuspec文件以下,其中ConsoleApp1这个Id表示Nuget Package的惟一标识
工具
下图是我本地文件夹包含的文件
有些文件其实并非咱们想要打进nuget包里的,这时候咱们能够编辑Nuspec文件,指定要包含的文件
ui
能够参考官方文档
nuspec文件描述:https://docs.microsoft.com/zh-cn/nuget/reference/nuspec
nuget package文件目录:https://docs.microsoft.com/zh-cn/nuget/create-packages/creating-a-package#from-a-convention-based-working-directory 文中写明了Nuget安装是对不一样的文件夹会有不一样的操做3d
nuget pack ConsoleApp1.nuspec -Version 1.0.0.0
生成对应的package文件 ConsoleApp1.1.0.0.0.nupkg
你们能够直接将nupkg文件解压缩,看看里面具体的文件目录code
nuget push ConsoleApp1.*.nupkg -Source YourSourceUrl -ApiKey YourApiKey
其中:component
nuget delete ConsoleApp1 1.0.0.0 -Source YourSourceUrl -ApiKey YourApiKey
htm
如今软件开发离不开代码版本管理,因此nuget一键打包也须要和代码版本管理结合,这里以git管理举例blog
@echo off set AssemblyName=ConsoleApp1 set ApiKey=YourApiKey set SourceUrl=YourSourceUrl echo 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安装一下就行?
ContentFiles文件夹在安装的时候没有任何行为
编辑Nuspec文件,在Files节点中指定
能够自行添加编译后指令将文件复制到输出目录中,以达到使用的目的
可是很显然,此方法并非很完美,难道每一个引用该package的人都要写一遍指令来复制文件吗?
Content文件夹对应的行为是内容复制到项目根目录。 将“内容”文件夹视为最终使用包的目标应用程序的根目录
用更直白的话语解释一下:放在content文件夹的内容在安装的时候,就像你手动在项目中添加文件同样
同ContentFiles同样,这里就再也不赘述
Nuget安装的时候将Build目录中的targets文件自动插入到项目中
下图是个人文件夹目录
其中components文件夹中包含了一组ConsoleApp1.dll依赖的C++组件
nuspec文件以下图
targets文件以下
最终打出来的包目录以下
这种方法只须要使用者直接引用nuget package便可,其余的均无需考虑,无论是依赖的是一个仍是一组C++组件,无论是在根目录下仍是包含子目录,均可以解决上面提到的问题。
实现的原理:nuget在安装package的时候,将Build目录中的targets文件直接导入到对应的project文件中,MSBuild执行的时候会将对应的文件输出到输出目录
这里重点提到一点即是
这个targets文件的名称必须在当前package的Id同样(很是重要)本文中都是ConsoleApp1
以上代码均为原创分享,若你们认为有不妥的地方,烦请留言指出,在下感激涕零