无法使用此安装程序来安装 .net framework_NuGet是什么?理解与使用(上)

b2dee5224bd7d269fccee7f84ab3babd.png

如果你了解python,那么它类似pip。

如果你了解nodejs,那么它类似npm。

如果你了解ruby,那么它类似gem。

对,它就是一个包(package)管理平台,确切的说是 .net平台的包管理工具,它提供了一系列客户端用于生成,上传和使用包(package),以及一个用于存储所有包的中心库即NuGet Gallery,如果有需要也可以搭建自己的私有NuGet库。

NuGet 官方​www.nuget.org

对于一个现代化的开发平台,建立一种让开发者创建,分享与使用可复用代码的机制是十分必要的。这种“可复用代码”被打包后的文件通常被称作“包”(package),对于.NET(包括 .NET Core)平台来说这个机制的实现就是NuGet平台。

NuGet的实现均为开源项目,包括了客户端工具,服务器,官方网站以及各语言的文档等。 这些项目可以在下面的链接中找到。

NuGet on GitHub​github.com

NuGet包的本质是一个以nupkg为后缀的zip压缩文件(你可以将后缀改为.zip后解压查看里面的内容),其中包含了编译后的Dll文件以及其他相关文件。下图显示nuget包从创建,上传到被使用的流程。

8c5e524f4eeb386daad65d1f09645055.png

NuGet的客户端融合在各类开发工具中,包括但不限于:

  1. .net core SDK中的nuget命令行;
  2. Visual Studio中的nuget工具;
  3. nuget.exe 命令行客户端;
  4. Visual Studio Code中的nuget插件;

7d69987a76acfaae04026d5610cb890c.png
nuget客户端工具

在了解了nuget大致概念后我们可以通过发布一个nuget包来更仔细的了解如何使用nuget以及其中的重要概念。

下文会以开发中最常接触到的Visual Studio( 本文使用Visual Studio 2017 Community )做为演示工具来创建一个nuget包。要创建一个包首先需要一个 .net项目,可以看到项目的创建页面有很多选择,类库项目就可以选择三种(.net core的类库项目未显示在截图中) .Net Core;.Net Framework 还有 .Net Standard,到底应该选择哪一种呢?

9f04dd73588698d4ddcf4012bef53a60.png
Visual Studio 2017 项目创建窗口

为了做出选择,我们首先要深入理解TFMs和 .net standard这两个概念。首先创建一个 .net core类库项目。

221f0bf034eee878b8c1042badcf1ea6.png
.net core类库项目结构

在项目目录中打开csproj文件可以看见下面的内容。

<Project 

可以看到该项目的TargetFramework为netcoreapp2.0,这里的netcoreapp2.0 就是TFMs,即Tagrget Framework Monikers 翻译过来就是“目标框架别名”,这个值指定了这个项目是跑在哪个Framework上的。

如今 .net平台有各种版本的Framework,在 .net core之前有 .Net Framework 1.0一直到现在的4.7等等各种版本, .net core现在有1.0/1.1/2.0/2.1。所有这些版本都有自己的代号/别名。全部的TFMs可以在下面的链接找到。

Target frameworks​docs.microsoft.com
19dd9d461616fae0572dbff3f7b0df9a.png

这仍然没有解决我们的问题:如何决定使用哪个Framework?现在需要引入 .Net Standard,它是一个标准, .net API的标准,用来描述每个Framework的API实现情况。标准的版本越往后支持的API就越多,也就兼容了之前的版本。

当前各个Framework的 .Net Standard版本如下图(如果你曾经了解Portable Class Libraries(PCL),它已经被 .net standard替代了,所以这里不多做说明。)

265d6c5639c7766b24141c0e0ba01c13.png

最新的内容可以在下面的链接中找到。

dotnet/standard​github.com

所以要选择哪个Framework,首先要确定的是:1)你的项目要使用哪些API?2)你项目要兼容哪些Framework? 总的来说:

  1. 选择更高的版本,你将有更多的API可以使用。(更丰富的API)
  2. 选择更低的版本,有更多的项目可以使用你的库。(更好的兼容性)

所以 .net standard的选择原则就是:在API够用的情况下选择尽量低的 .net standard标准。这需要根据实际的项目需求来进行判断。

了解了TFMs和 .net standard后我们绕回来说NuGet,创建一个 .net standard 2.0 类库项目。

05027499ebe2410bd343a90f778abf95.png

打开csproj我们可以看到

<Project 

可以看到TargetFramework是netstandard2.0。如果我们需要更改TargetFraamework,可以选择项目【属性】在【应用程序】页面可以进行更改。

047b8d039b337b6bdc81d1077a49ba07.png
目标框架修改

为了演示我们为项目添加一个第三方包Newtonsoft.Json,右键点击项目选择管理NuGet程序包。

25b004aa5c28f81db142f04a203b156e.png

打开后可以在Visual Studio左侧看到下面的界面。

6f0035bdae526f6710254336c2cf5dd6.png

这里显示了项目已安装的包,这个包由我们选择的Target Framework隐式引用的。现在我们点击浏览,搜索Newtonsoft.Json。

d9338567b5c8f82ddc85aa990cf46be6.png
120M的下载量,可见现在json的流行程度

点击安装。

9e3d97b490300e3dd87ffa160a9a0956.png

安装完成后可以看到程序包管理器输出以下信息,并且引用中也添加了新的项目。

53b60b55f8dd5283659ae72b61e0cfe4.png

79d305050ca9a4d7925fa77b8f7a4b7a.png

但是我并没有在项目文件夹下找到任何Newtonsoft.Json的程序集,包在哪?其实包被下载到了一个nuget公共目录,在我的Windows10系统上是 C:Userswangl.nugetpackages,这样nuget包就不会被重复下载。而在项目中nuget仅仅将依赖信息写入了csproj项目文件与obj文件夹中的project.assets.json,其中csproj项目文件中的内容如下。

<Project 

包所依赖的内容并不会被打包到最后的.nupkg文件中,NuGet只是将依赖信息写入包,在最终使用这些包的应用程序编译时还原所有的依赖。

至此我们简单了解了NuGet给项目添加引用的过程。对于更复杂情况的引用,如下图

8e0a61b11637419f188c7391c795c441.png
项目引用示例

这个项目的依赖树中有三个对B包的引用,而三个包的版本要求可能是不相同的,但幸好我们只需要关心我们项目直接引用的包,因为Nuget会帮我们管理所有包的依赖并且对于被多次引用的包,Nuget会找出满足该包所有使用者的版本(不过因为版本要求冲突而找不到适合包的情况是有可能的)。如果需要更详细的了解nuget如何解析项目包的引用可以前往下面的链接。

NuGet Package Dependency Resolution​docs.microsoft.com
19dd9d461616fae0572dbff3f7b0df9a.png

现在开始打包我们的类库项目,首先要为包设置一些诸如版本,作者等相关信息。右键点击项目选择【属性】,再选择【打包】页,可以在这里输入包的描述信息。

392395664cb213c496fd50e8028cd302.png

打开csproj项目文件,可以看到这些信息也是保存在其中的。

<Project 

填写好信息后保存。回到解决方案,右键点击项目选择【打包】,可以看到以下输出。

1>------ 已启动生成: 项目: FishNo6.DemoPackage, 配置: Debug Any CPU ------
1>FishNo6.DemoPackage -> E:labsFishNo6.DemoPackageFishNo6.DemoPackagebinDebugnetstandard2.0FishNo6.DemoPackage.dll
1>已成功创建包“E:labsFishNo6.DemoPackageFishNo6.DemoPackagebinDebugFishNo6.DemoPackage.1.0.1.nupkg”。
========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========

在对应目录就可以找到nupkg包文件了。如果你的电脑安装了NuGet Package Explorer可以直接双击打开包来查看信息,这个应用可以在Window Store中安装。

75b93a4bb103ebae3b32da870d9285af.png

到此我们成功创建了一个NuGet包。

下篇内容包括如何将包上传到NuGet Gallary(NuGet官方库)以及更深入的了解NuGet平台。

最后附上NuGet官方文档。

NuGet Documentation​docs.microsoft.com
19dd9d461616fae0572dbff3f7b0df9a.png

本文的目的是记录与分享自己的学习过程和个人你的看法。如果对你有任何帮助深感荣幸,若有任何纰漏烦请指正。如有任何问题请在评论里留言,我会尽量解答。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297568.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NoSQL 是否可以用来做日志中心 ?

咨询区 ikrain&#xff1a;请问大家在分布式程序中用 nosql 来做日志中心的经验&#xff1f;我做了一些研究&#xff0c;发现用 Mongodb 做日志中心是一个非常好的选择&#xff0c;而且我发现 log4net 对它也是直接集成的&#xff0c;比如: log4mongo-net 。不知道大家可推荐这…

effective C++ 条款 3:尽可能使用const

const 修饰指针&#xff1a;如果关键字const出现在星号*左边&#xff0c;表示被指物是常量&#xff0c;如果const出现在*右边表示指针自身是常量&#xff0c; 如果出现在两边表示被指物和指针都是常量&#xff1b; const std::vector<int>::iterator iter vec.begin(); …

为团委出书写:《打造社团品牌:请给我一个理由,让我记住你!》

前些日子&#xff0c;大学母校的棋社社长欢欢给我打电话&#xff0c;说团委要出一本论述社团发展的书&#xff0c;希望我这个老社长代表翰轩棋社写一篇文字&#xff0c;说最好要5000字&#xff0c;我当时觉得压力巨大&#xff0c;现在经过几个日夜终于写出来了&#xff0c;没想…

长能耐了?想造反了?你老婆没了.......

1 提出问题的人一律直接解决掉▼2 今年的心理阴影是金字塔和钢琴键带来的▼3 广州考如何催收房租&#xff1f;▼4 想起了大雄的衣柜......▼5 这简直一毛一样▼6 我今天非要跳上去不可&#xff01;突然想到我还有点急事&#xff0c;告辞……▼7 据说&#xff0c;有不少男…

php 无限查找下级业绩_PHP 面试踩过的坑

因为最近需要面试&#xff0c;所以特意整理了一下面试所经历的一些面试题。分享一下&#xff0c;希望对自己有用&#xff0c;也对其他人有用。尚未有答案的&#xff0c;后面会陆续更新&#xff0c;如果有补充答案的&#xff0c;也十分感激。1.get,post 的区别**显示有区别 **ge…

蓝牙Bluetooth技术手册规范下载【转】

蓝牙Bluetooth技术手册规范下载 http://www.crifan.com/summary_bluetooth_specification_download/ 【背景】 之前就已经整理和转帖了和蓝牙技术相关的一些内容&#xff1a; 【资源下载】bluetooth 协议 spec specification 蓝牙1.1、蓝牙1.2、蓝牙2.0&#xff08;蓝牙2.0EDR&…

微型计算机原理中LEA,微型计算机系统原理及应用(第2版)第2章

第二章微型计算机指令系统题2-1 试分别说明以下各指令的源操作数属于何种寻址方式。答&#xff1a;1、MOV AX ,[SP] ——寄存器间接寻址2、MOV DS ,AX ——寄存器寻址3、MOV DI ,0FF00H ——立即数寻址4、MOV BX ,[2100H] ——直接寻址5、MOV CX ,[SI5] ——变址寻址6、MOV AX …

python获取历史双色球数据_你的梦想,我来买单!Python分析双色球中奖号码竟成功获取特等奖

关于双色球的话题估计大家都听的很多&#xff0c;毕竟成本很低&#xff0c;但是收获很高。毕竟当利润达到100&#xff05;时,就有人敢于铤而走险。当利润达到200&#xff05;时,他们就敢于冒上断头台的危险。 而当利润达到300%他们就会践踏人间的一切法律。更何况是n倍的利润刺…

[恢]hdu 2147

2011-12-20 15:42:45 地址&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid2147 题意&#xff1a;n*m的棋盘&#xff0c;一开始在右上角。每次只能走到左、下 或者左下。判胜败。 mark&#xff1a;简单博弈。n、m同时为奇数则败。 代码&#xff1a; # include <stdi…

分布式、微服务必须配个日志管理系统才优秀,Exceptionless走起~~~

前言在真实的项目中&#xff0c;不管是功能日志、错误日志还是异常日志&#xff0c;已经是项目的重要组成部分。在原始的单体架构&#xff0c;通常看日志的方式简单粗暴&#xff0c;直接登录到服务器&#xff0c;把日志文件拷贝下来进行分析&#xff1b;而如今分布式、微服务架…

Hotspot hotswap, who and who are best freinds

Hotspot&hotswap,whoandwhoarebestfreinds(点击这里查看ppt)java动态替换的ppt。hotspot&hotswapwhoandwhoarebestfriendsxuanxitaobao.comwhyweneedhotswap&#xff1f;主管:你在偷懒&#xff1f;汇编开发人员&#xff1a;我在编译。C开发人员:我在编译打包部署。java…

《TCP/IP详解卷1:协议》第6章 ICMP:Internet控制报文协议-读书笔记

章节回顾&#xff1a; 《TCP/IP详解卷1&#xff1a;协议》第1章 概述-读书笔记 《TCP/IP详解卷1&#xff1a;协议》第2章 链路层-读书笔记 《TCP/IP详解卷1&#xff1a;协议》第3章 IP&#xff1a;网际协议&#xff08;1&#xff09;-读书笔记 《TCP/IP详解卷1&#xff1a;协议…

10以内的分解与组成怎么教_狗狗酷炫的飞盘游戏怎么玩?分解步骤教你快速学会...

现在的铲屎官都喜欢训练自己的狗狗&#xff0c;训练狗狗不仅可以增加狗狗与主人的感情&#xff0c;还能增强狗狗的协调性&#xff0c;开发狗狗的智力&#xff0c;可谓一举两得。其中飞盘是大家都比较爱的活动&#xff0c;经常看看狗狗以华丽的身姿一跃接起主人扔的飞盘&#xf…

计算机组成与系统 报告,计算机组成与系统结构实验报告2

计算机组成与系统结构实验报告,西北工业大学评语: 课中检查完成的题号及题数&#xff1a; 成绩:自评成绩:95课后完成的题号与题数&#xff1a;实验报告实验名称&#xff1a; 班级&#xff1a;1.4 CPU 与简单模型机设计实验 日期&#xff1a; 2015.11.16 杨添文10011303 学号&am…

c++ 异步下获取线程执行结果_前端异步编程的那些事

啊一、异步编程的运行机制我们学习Javascript语言的时候就知道它的执行环境是”单线程“的。所谓”单线程“&#xff0c;就是指一次只能处理一个任务。如果有多个任务&#xff0c;就必须排队&#xff0c;前面一个任务完成&#xff0c;再执行后面一个任务。常见的浏览器无响应(假…

自动驾驶规划算法

本文将讲解BFS&#xff0c;Dijstra&#xff0c;A*&#xff0c;动态规划的算法原理&#xff0c;不正之处望读者指正&#xff0c;希望有兴趣的读者能在评论区提出一些这些算法的面试考点&#xff0c;共同学习&#xff0c;一起进步 0 图论基础 图有三种&#xff1a;无向图、有向…

印度网民集体删除中国APP,网友评论亮了

全世界只有3.14 % 的人关注了爆炸吧知识最近&#xff0c;国外有一款Remove China Apps火了。这款APP只有一个功能&#xff1a;可以一键扫描用户手机里的应用&#xff0c;识别出自中国公司的应用&#xff0c;并进行一键删除的骚操作。应用的主图标、界面&#xff0c;甚至特意使用…

SQL Server 负载均衡集群(转)

SQL Server 负载均衡集群一个应用系统随着业务量的提高,以及访问量和数据流量的快速增长&#xff0c;各个核 心部分的处理性能和计算强度也相应增大&#xff0c;使得单一设备根本无法承担。在此情况下&#xff0c;如果扔掉现有设备去做大量的硬件升级&#xff0c;必将造成现有资…

大前端快闪二:react开发模式 一键启动多个服务

最近全权负责了一个前后端分离的web项目&#xff0c;前端使用create-react-app[1], 后端使用golang做的api服务。npx create-react-app my-app cd my-app npm start歘歘歘&#xff0c;就搭建了一个react前端项目。前端老鸟都知道npm start或yarn start以开发模式启动react App&…

数据库比较工具SQL Delta

SQL Delta 版本4只支持SQL Server数据库 版本5支持Oracle 但是数据库中不可以有英文 否则连接时会报 ORA-12737: Instant Client Light: unsupported server character set ZHS16GBK的错误 配置如下所示&#xff1a; 转载于:https://blog.51cto.com/shuimomo/461266