本篇将回答下面几个问题:
- 如何解读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 frameworksdocs.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 CLIdocs.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 packagedocs.microsoft.com
希望本篇能让你对.net的包管理平台有基本的了解,利用好NuGet平台会给你以后的项目开发提供很大的帮助。
最后,如果你有任何问题欢迎在评论,我会尽量解答。
如果喜欢类似的文章,请关注,非常感谢,.net社区的壮大需要大家的努力。