创建NuGet包

在创建一个NuGet包之前我们应该先创建一个以.nuspec为后缀的xml清单文件,这个清单文件描述了包的内容,在安装NuGet包的过程中这个清单文件扮演者很重要的角色。实际上它的作用就像app.config一样,并且是不可或缺的一部分,因此在了解如何创建一个NuGet包之前很有必要了解一下什么是nuspec清单文件。

什么是.nuspec清单文件

nuspec文件是一个xml格式的清单文件,它用于描述包的内容和驱动包的生成过程。下面是一个典型的nuspec文件定义:

<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
<metadata>
<!-- 包的id,在托管库内必须唯一 -->
<id>xxx.xxx.xxx</id> <!-- 解析依赖项时使用的包版本号 -->
<version>1.0.0.1</version> <!-- 在库中显示的作者 -->
<authors>nizhenghua</authors> <!-- 库的拥有者,便于用户能够轻松的获取到该拥有者发布的其他的包 -->
<owners>nizhenghua</owners> <!-- 项目的许可和地址(比如将源代码发布到Github上时可以在此填写许可和) -->
<licenseUrl>http://opensource.org/licenses/MS-PL</licenseUrl>
<projectUrl>http://github.com/nizhenghua</projectUrl> <!-- 在Visual Studio中的可视化包管理器中展示的图标 -->
<iconUrl>http://xxxxxxxxxx.png</iconUrl> <!-- 在用户安装包的时候是否提示接受许可信息 -->
<requireLicenseAcceptance>false</requireLicenseAcceptance> <!-- 发布记录 -->
<releaseNotes>Bug fixes and performance improvements</releaseNotes> <!-- 包的描述信息 -->
<description>xxxxxxxxxxxxxxxxx</description> <!-- 版权 -->
<copyright>Copyright ©2016 xxxxx</copyright> <!-- 标签,用户可通过标签进行搜索 -->
<tags></tags> <!-- 包的依赖关系,在安装包的时候会自动安装所有依赖 -->
<dependencies>
<dependency id="Newtonsoft.Json" version="9.0" />
</dependencies>
</metadata> <!-- 当包安装完成的时候会自动展示readme.txt(包不能是依赖项目) -->
<files>
<file src="readme.txt" target="" />
</files>
</package>

nuspec中必须包含以下的信息:

  • id:标识符,在托管库内必须唯一
  • version
  • title:用于在NuGet库中显示
  • authors
  • owners
  • description

除此之外还可以包含releaseNotes、coptright、tags等其他信息。


使用nuget命令行工具创建nuspec清单文件

  • 通过项目创建

    定位到包含csproj项目文件的目录,执行nuget spec

  • 通过已有的dll创建

    nuget spec dll路径

  • 通过基于约定的目录创建

    文件夹 描述 安装时的操作
    tools powershell脚本和命令行程序 内容会复制到项目,tools文件夹会添加到环境变量
    lib dll、xml、pdb等文件 dll会添加到引用,xml和pdb复制到项目
    content 任意文件 内容复制到项目根目录
    build MSBuild target和props文件 自动插入到项目文件(NuGet2.x)或project.json.lock(NuGet3.x)

设置包类型

  • Dependency:在兼容的前提下可以在任何项目中安装
  • DotnetCliTool:作为.NET CLI的扩展,必须在命令行调用,且只能在.NET Core项目中使用
  • Custome

创建NuGet包

nuget pack xxx.nuspec

nuget pack xxx.csproj

如果在当前nuspec清单文件夹下使用命令可以简写:nuget pack

编译设置

nuget pack xxx.csproj -properties Configuration = Release

包含符号文件

使用 nuget pack xxx.csproj -symbols 将符号信息一起打进包内

依赖项的版本号设置

可以在nuspec清单中自行设置对其他包的依赖信息。例如:

<dependencies>
<dependency id="Newtonsoft.Json" version="9.0" />
<dependency id="EntityFramework" version="6.1.0" />
</dependencies>

设置的依赖项会在该包安装完成后自行安装。其中最重要的属性就是Version,一个包通过不停的更新迭代可能会有多个版本,可以通过Version来指定依赖的是包的哪个版本。NuGet也提供了一组指定版本范围的符号使得我们可以更加灵活的设置依赖项的版本号。

符号 应用规则 描述
1.0 x >= 1.0 大于等于1.0版本
(,1.0) x < 1.0 小于1.0版本
(1.0,) x > 1.0 大于1.0版本
[,1.0] x <= 1.0 小于等于1.0版本
[1.0,] x >= 1.0 大于等于1.0版本
(1.0,2.0] 1.0 < x <= 2.0 大于1.0版本,小于等于2.0

这种表示方法和数学上的集合类似,小括号表示的区间不包含端点,中括号包含端点

3.4版本后对版本号会做一些特殊处理

  • 删除版本号的前导0 如1.00.1会被处理成1.0.1

  • 删除版本号第四部分的0 如1.0.1.0会被处理成1.0.1

在2.5版本之前,如果在安装包的过程中已经安装了依赖的包,那么会自动升级到最新的版本,2.5之后的版本不会再安装已经存在的包

创建NuGet包的更多相关文章

  1. 如何使用跨平台工具创建 NuGet 包(转)

    原文地址 https://docs.microsoft.com/zh-cn/dotnet/articles/core/deploying/creating-nuget-packages 内容 对于 . ...

  2. 项目文件中的已知 NuGet 属性(使用这些属性,创建 NuGet 包就可以不需要 nuspec 文件啦)

    知道了 csproj 文件中的一些常用 NuGet 属性,创建 NuGet 包时就可以充分发挥新 Sdk 自动生成 NuGet 包的优势,不需要 nuspec 文件啦.(毕竟 nuspec 文件没有 ...

  3. [UWP] 为WinRT组件创建Nuget包

    Nuget 是 dotnet 开发中必不可少的包管理工具,但不仅仅局限于 dotnet 项目,在 VS 中使用 C++ 开发的时候,也可以使用 Nuget 来引用第三方组件.同样也可以用 Nuget ...

  4. 使用命令行打包 nuget 包

    对于那些不打算涉及这么复杂而又想制作自己的 nuget 包的园友们,我是推荐使用 Nuget Package Explorer 来制作的.关于这个图形化的 nuget 包管理软件的使用,博客园内有相关 ...

  5. 使用NuGet发布自己的.NET NuGet 包( .NET Standard & Windows)

    发布自己的nuget包 STEP 1:获取API Key 首先,你需要到NuGet上注册一个新的账号,然后在My Account页面,获取一个API Key,或者是自建服务器上生成一个API Key( ...

  6. 使用GUI工具高效构建你自己的Nuget包

    写这篇文章的原因是我在学习构建nuget包的时候,发现了一个官方推荐的GUI工具,而官方的工具介绍文章已经过时,一些地方和现在最新版本的工具有些差异,所以特意利用假期最后一个下午写下来,希望能帮助更多 ...

  7. 自动将 NuGet 包的引用方式从 packages.config 升级为 PackageReference

    在前段时间我写了一篇迁移 csproj 格式的博客 将 WPF.UWP 以及其他各种类型的旧样式的 csproj 文件迁移成新样式的 csproj 文件,不过全过程是手工进行的,而且到最后处理 XAM ...

  8. 用命令行工具创建 NuGet 程序包

    NuGet.exe 下载地址 本文翻译自: https://docs.nuget.org/Create/Creating-and-Publishing-a-Package https://docs.n ...

  9. 使用CoApp创建NuGet C++静态库包

    NuGet是微软开发平台下的包管理软件,使用它你可以非常方便的将一些第三方的库.框架整合进自己的项目中,省去了不少麻烦的配置过程.但是从官方文档上来看,貌似NuGet对C++的支持不是很好,并且在现阶 ...

随机推荐

  1. 【精选】Ubuntu 14.04 安装Nginx、php5-fpm、ThinkPHP5.0(已经测试上线)

    sudo apt-get update 安裝Nginx https://www.vultr.com/docs/setup-nginx-rtmp-on-ubuntu-14-04 安裝完成後,Nginx的 ...

  2. 手机中的js事件

    // 手势事件 touchstart //当手指接触屏幕时触发 touchmove //当已经接触屏幕的手指开始移动后触发 touchend //当手指离开屏幕时触发 touchcancel // 触 ...

  3. 轻松使用div模拟select下拉菜单

    没有办法,平时不是万不得已我是不喜欢去模拟各类控件的,一个是麻烦,二个是对性能也有些影响,还是原生的来的实在.老板昨天发话,必须模拟赶紧的,老外最喜欢简洁干净的风格,说的貌似都很在理的样子,业务部也是 ...

  4. FPGA基础知识8(FPGA静态时序分析)

    任何学FPGA的人都跑不掉的一个问题就是进行静态时序分析.静态时序分析的公式,老实说很晦涩,而且总能看到不同的版本,内容又不那么一致,为了彻底解决这个问题,我研究了一天,终于找到了一种很简单的解读办法 ...

  5. 20155210潘滢昊 2016-2017-2 《Java程序设计》第5周学习总结

    20155210 2016-2017-2 <Java程序设计>第5周学习总结 教材学习内容总结 try with resources 关闭多个资源时用分号分隔 java.lang.Auto ...

  6. llg的农场(farm)

    评测传送门 [题目描述] llg 是一名快乐的农民,他拥有一个很大的农场,并且种了各种各样的瓜果蔬菜,到了每年秋天,他就可以把所有蔬菜水果卖到市场上,这样他就可以获利.但今年他遇到了一个难题——有许多 ...

  7. 编写高效的JavaScript程序

    作者: Addy Osmani  来源: CSDN  发布时间: 2013-01-10 14:15  阅读: 7952 次  推荐: 15   原文链接   [收藏] 英文原文:Writing Fas ...

  8. 工具推荐:Backdoor-apk,安卓APK文件后门测试工具

    工具推荐:Backdoor-apk,安卓APK文件后门测试工具 Backdoor-apk可以看成是一个shell脚本程序,它简化了在Android APK文件中添加后门的过程.安全研究人员在使用该工具 ...

  9. [JL]最后的晚餐 动态规划(DP) codevs5318

    [JL]最后的晚餐 TimeLimit:1000MS  MemoryLimit:1000KB 64-bit integer IO format:%lld Problem Description [题库 ...

  10. java8中对lamdba表达式方法参数传递时,方法重载之后的类型推断

    java8中可以向方法传递一个lamdba表达式,今天看书关于类型推断碰到一个问题: 这个问题我实际操作了一下:得出结论 如果是只有一个方法的情况下,方法参数使用lamdba表达式的时候是不需要写类型 ...