本篇将回答下面几个问题:

  • 如何解读NuGet Gallery上的包信息?
  • 如何上传NuGet包到NuGet Gallery?
  • 如何安装本地NuGet包?
  • NuGet包的内容文件与目录结构?

如果你没看过上篇那么它在这里:

6号咸鱼:NuGet是什么?理解与使用(上)​


那么开始,

一,如何解读NuGet Gallery上的包信息?

我们先以Newtonsoft.Json为例,在其NuGet页面上可以看到如下页面,其中包含了作者,描述,依赖等等信息。

其中重要的依赖关系(部分)如下,

较大字体显示内容如.NETFramework 2.0表示Target Framework(目标框架),在Target Framework下面的为此Target Framework对应的依赖,所以用一句话可以解读为:“如果你项目的目标框架也是.NETFramework 2.0,那么你就不需要依赖任何其它包就可以使用这个包”。同样的下面.NETFramework 1.0的含义就是:“如果你的项目的目标框架为.NETFramework 1.0那么需要引用下面的包后才能使用该包。”不过这些都不需要你手动去引用,NuGet会在你安装该包时自动安装其依赖的包。

Newtonsoft.Json这样的包是NuGet平台上的典型,除此之外还有一些比较特殊但也非常重要的包。我们来看一下Microsoft.NETCore.Platforms,下面是这个包的页面。

可以看到这个包竟然没有任何依赖,这是因为这个包并不包含任何DLL,所以也不需要依赖任何目标框架,NuGet的包可以包含任何你想发布的文件而不仅仅是DLL程序集。

下面在介绍另一种比较特殊的包,元包(Meta Package), Microsoft.AspNetCore.All就是一个元包 ,下面是它的页面。

页面上显示和普通的包并没有区别,为了更直观的演示我们把这个包的nupkg文件下载到本地,解压后可以看到在其lib目录下面只包含了一个空文件。

其实这个包本身并不包含内容,它通过对其他包的依赖定义自己。元包是一个NuGet包的约定,描述了一组放在一起有意义的包(Metapackages are a NuGet package convention for describing a set of packages that are meaningful together.)

这样做的原因首先是因为NuGet的包管理是“细粒度”的,原则上每个程序集(DLL)都应该是一个包,这样可以带来以下几个好处:

  • 细粒度的包在开发、测试的过程中与其它包的关联有限。
  • 细粒度的包可以提供对不同操作系统和CPU的支持。
  • 细粒度的包可以只依赖某个特定的库。
  • 在发布应用时,未被引用的包不会成为应用的一部分,因此应用程序的体积会有更小。

但是对于某些情况,元包则有更多好处:

  • 在引用大量细粒度包时有更好的用户体验
  • 定义了一组经过测试且运行良好的包(包括指定的各种版本)

而下面这个元包比较特殊:Microsoft.NETCore.App,因为它不仅是元包也定义了框架,也就是我们项目里的目标框架(Tagrget Framework)。这会在解读这类目标框架的元包时造成一定的困惑,以 Microsoft.NETCore.App上的页面为例,因为他本身定义了目标框架。不过我们应该不会手动去引用这些包,这些包通常是在是设置目标框架是被项目隐式应用的。

下面这张图描述了这种关系:API定义了框架,框架用于元包中包的选择,而这些包给你提供了API的实现。

更多资料可以查看下面这篇文章和其中文译文,对你理解NuGet平台和包,元包,框架的设计很有帮助。

Packages, metapackages and frameworks​docs.microsoft.com.NET Core中的包、元包与框架​www.cnblogs.com

二,如何上传NuGet包?

要上传NuGet包到NuGet Gallery,首先你需要一个NuGet账号或者微软账号,然后准备好你的nupkg文件就可以开始上传了。

下面简单介绍三种方式:

1,在NuGet Gallery网页上传包,这是最方便快捷的方式。登录NuGet Gallery 点击Upload菜单进入上传页面。

nuget gallery包上传页面

点击Browse选择你的包文件,页面将读取你的包信息并显示在页面上。

填写包的文档相关信息。

填写包的文档相关信息

确保所有信息正确后就可以点击Submit发布你的包了!

2,在NuGet Package Expolrer中上传包,这个应用可以在Windows Store中免费安装。在使用该工具上传包之前你需要一个API Key,因为除使用官方上传页面的方式外所有其他方式上传包都需要使用一个API Key,这个Key可以在官方网站获取。在个人帐号的下拉菜单中选择API Keys。

进入API Key管理页面,点击如下图的Create,开始创建一个API Key。

填写好Key的名称,过期时间,再选择该Key可以使用的功能和对应的包,点击确认成功创建后可以看到如下图的页面。

点击Copy就可以拷贝你的Key到剪贴板。有了API Key之后我们使用NuGet Explorer打开我们的包,在File菜单中选择Publish.

点击Publish后出现如下界面。

输入所需的API Key点击Publish。

3,使用 .net core SDK命令行上传包,可以执行dotnet nuget push的命令,其中第一个参数为包所在目录,若再当前目录可直接填入文件名, -k参数就是我们在上面所获取到的API Key,如下面的命令行示例。

dotnet nuget push foo.nupkg -k 4003d786-cc37-4004-bfdf-c4f3e8ef9b3a

该命令还有许多其他参数,更多信息可前往下面的链接:

dotnet nuget push command - .NET Core CLI​docs.microsoft.com

需要注意的是包上传后是不能被删除的,只能被unlist。鉴于此我没有真的上传我的包,因为知道一个完全没有意义的包在我的账号里还无法删除会让我寝食难安的。大家可以自己动手尝试。

三,如何安装本地NuGet包?

以Visual Studio 2017 Community为例,打开你的项目,右键点击项目选择【管理NuGet程序包】。

然后点击NuGet程序包管理界面右上角的齿轮,出现下面的设置窗口。

点击+号新建一个可用程序包源,设置你想要的名称并选择源的所在目录,点击确定。

再次打开NuGet程序包器,你可以在程序包源选项中看到看添加的源,选中后就可以看到你在该本地路径中放置的包了!

四,NuGet包的内容与目录结构?

我们仍以Newtonsoft.Json包为例,将后缀改为.zip并解压后可以看到以下目录结构。

其中lib目录如下图,它保存了各个目标框架下对应的程序集。

Newtonsoft.Json.nuspec为xml格式的manifest文件保存了包的元数据,如作者,版本,包含内容等等信息。rels,[Content_Types].xml,package为打包时生成的文件。

除了这些目录外,包内还可以包含runtimes,content,build,tools等文件夹,下面介绍runtimes和content文件夹。

如果你的程序集对不同的操作系统有不同的实现,你需要将这些程序集按照下面的目录结构放入runtimes文件夹中。

\runtimes\win10-arm\native\lib\uap10.0\win10-x86\native\lib\uap10.0\win10-x64\native\lib\uap10.0

而对于content文件夹,你可以把它看做是目标项目的根目录,也就是该文件夹下的内容会在包被安装时拷贝到项目的目录下。比如包里的content/images目录在包被安装之后就会在你的项目目录下放置一个images目录。

除了这些主要的文件夹,NuGet包里还可以包含build,tools等文件夹和文件,更多详细内容可查看下面的文档。

How to create a NuGet package​docs.microsoft.com

希望本篇能让你对.net的包管理平台有基本的了解,利用好NuGet平台会给你以后的项目开发提供很大的帮助。

最后,如果你有任何问题欢迎在评论,我会尽量解答。

如果喜欢类似的文章,请关注,非常感谢,.net社区的壮大需要大家的努力。

NuGet是什么?理解与使用(下)相关推荐

  1. 绑定dictionary 给定关键字不再字典中_对字典嵌套的理解及二级下拉菜单的制作...

    大家好,今日我们继续讲解VBA数组与字典解决方案,今日讲解第51讲:对字典嵌套的理解及二级下拉菜单的制作. 在讲字典的时候,我反复说明,字典看视非常简单,由于它具有直达性可以省略去我们大量的循环查找代 ...

  2. matlab中的logspace,matlab中的logspace(a,b,n)究竟怎么理解,看下例题,谁能详细解给我看...

    matlab中的logspace(a,b,n)究竟怎么理解,看下例题,谁能详细解给我看 来源:互联网  宽屏版  评论 2009-12-07 10:11:30 分类: 教育/科学 >> 学 ...

  3. NuGet 是什么? 理解与使用

    NuGet 是什么? 理解与使用 NuGet 是一个自由开源软件包管理系统,用于Microsoft开发平台,以前称NuPack. NuGet 作为 Visual Studio 扩展,能够简化在 Vis ...

  4. 理解VMware虚拟机下网络连接的三种模式

    很多朋友都用vmware来测试不同的系统,我结合自己的经验谈一下对网络设置的理解,不对的地方请指正. bridge:         这种方式最简单,直接将虚拟网卡桥接到一个物理网卡上面,和linux ...

  5. 深入理解linux系统下proc文件系统内容

    另外,可以参考这个http://www.centos.org/docs/5/html/5.1/Deployment_Guide/ch-proc.html 内容摘要:Linux系统上的/proc目录是一 ...

  6. ELV局部视图与差分隐私【敏感度到底怎么理解】【下】

    [后续]Analyzing Subgraph Statistics from Extended Local Views with Decentralized Differential Privacy ...

  7. hadoop之理解tmp目录下的文件

    1)修改tmp路径 解决办法将原来name copy /home/crx/tmp (这个路径是之前在HADOOP_HOME/etc/hadoop/core-site.xml 中name标签下配置的路径 ...

  8. 常用设计模式之白话精简理解及应用-下

    工厂模式 上一篇我们先学习了单例和模板方法两个设计模式,单例模式在JDK中java.lang.Runtime使用饿汉式还有Spring从单例池获取bean的方法getSingleton,Spring解 ...

  9. 由《道德经》的理解,说下我的求道与守弱,无为以求有为

    首先 我会陈述求道的自我理解,然后陈明我根据求道描述我偏向的做事风格,以作抛砖之用. 为什么求道? 初始的时候,对"道"这个概念的理解基本是趋于"无"的.后来随 ...

  10. 深入理解WPF框架下的await

    前言: 这一段时间开始在着手WPF的项目,在开发过程的间歇恶补下WPF基础.asyc await作为framework4.5的新特性,也在我的项目中得到应用.有个这个特性以后确实又是一个大大的语法糖福 ...

最新文章

  1. enable_shared_from_this理解
  2. jquery中在子窗口中获取父窗口的Input文本值
  3. 我所经历的大文件数据导出(后台执行,自动生成)
  4. java怎么将前端的数据存到关联的表中_MySQL数据库性能优化
  5. storyboard搭建项目_Storyboard 快速搭建UICollectionView
  6. 多线程之线程池的应用
  7. 【转载】图论 500题——主要为hdu/poj/zoj
  8. @NotNull 、@NotBlank、@NotEmpty区别
  9. 看完c++ primer之后看什么
  10. linux内核netfilter模块分析之:HOOKs点的注册及调用
  11. 一线技术人的成长思考总结
  12. PAT甲级1115 DFS和BST
  13. myeclipse中hibernate出错
  14. 每天2小时,吃透 985博士总结的这套保姆级TensorFlow + PyTorch笔记(20G高清/PPT/代码)
  15. ssh远程登录报错:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED
  16. 鼠标测试软件m,罗技M525鼠标使用测试_罗技 M525鼠标_键鼠评测-中关村在线
  17. 企业网络项目投标范文
  18. 计算机如何调整对比度,怎么调整电脑显示器亮度和对比度
  19. 做移动视频直播应用的思路
  20. 石像鬼 openwrt chinadns dns-forwarder 开机无法自动启动

热门文章

  1. Android笔记-Activity相关+内存泄漏
  2. Java并发编程笔记之ThreadLocal内存泄漏探究
  3. redis 批量删除操作
  4. java实例练习——基于TCP/IP协议的多客户端通信
  5. Linux文件基本操作
  6. java中CardLayout的使用方法
  7. 花花酱leetcode 题目——搜索专题
  8. [Leetcode][第657题][JAVA][机器人能否返回原点][数组][HashMap]
  9. linux vma,内存管理 – Linux内核API find_vma
  10. python第三方库全部_自动更新Python所有第三方库