无法使用此安装程序来安装 .net framework_NuGet是什么?理解与使用(上)
如果你了解python,那么它类似pip。
如果你了解nodejs,那么它类似npm。
如果你了解ruby,那么它类似gem。
对,它就是一个包(package)管理平台,确切的说是 .net平台的包管理工具,它提供了一系列客户端用于生成,上传和使用包(package),以及一个用于存储所有包的中心库即NuGet Gallery,如果有需要也可以搭建自己的私有NuGet库。
NuGet 官方www.nuget.org
对于一个现代化的开发平台,建立一种让开发者创建,分享与使用可复用代码的机制是十分必要的。这种“可复用代码”被打包后的文件通常被称作“包”(package),对于.NET(包括 .NET Core)平台来说这个机制的实现就是NuGet平台。
NuGet的实现均为开源项目,包括了客户端工具,服务器,官方网站以及各语言的文档等。 这些项目可以在下面的链接中找到。
NuGet on GitHubgithub.com
NuGet包的本质是一个以nupkg为后缀的zip压缩文件(你可以将后缀改为.zip后解压查看里面的内容),其中包含了编译后的Dll文件以及其他相关文件。下图显示nuget包从创建,上传到被使用的流程。
NuGet的客户端融合在各类开发工具中,包括但不限于:
- .net core SDK中的nuget命令行;
- Visual Studio中的nuget工具;
- nuget.exe 命令行客户端;
- Visual Studio Code中的nuget插件;
在了解了nuget大致概念后我们可以通过发布一个nuget包来更仔细的了解如何使用nuget以及其中的重要概念。
下文会以开发中最常接触到的Visual Studio( 本文使用Visual Studio 2017 Community )做为演示工具来创建一个nuget包。要创建一个包首先需要一个 .net项目,可以看到项目的创建页面有很多选择,类库项目就可以选择三种(.net core的类库项目未显示在截图中) .Net Core;.Net Framework 还有 .Net Standard,到底应该选择哪一种呢?
为了做出选择,我们首先要深入理解TFMs和 .net standard这两个概念。首先创建一个 .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 frameworksdocs.microsoft.com
这仍然没有解决我们的问题:如何决定使用哪个Framework?现在需要引入 .Net Standard,它是一个标准, .net API的标准,用来描述每个Framework的API实现情况。标准的版本越往后支持的API就越多,也就兼容了之前的版本。
当前各个Framework的 .Net Standard版本如下图(如果你曾经了解Portable Class Libraries(PCL),它已经被 .net standard替代了,所以这里不多做说明。):
最新的内容可以在下面的链接中找到。
dotnet/standardgithub.com
所以要选择哪个Framework,首先要确定的是:1)你的项目要使用哪些API?2)你项目要兼容哪些Framework? 总的来说:
- 选择更高的版本,你将有更多的API可以使用。(更丰富的API)
- 选择更低的版本,有更多的项目可以使用你的库。(更好的兼容性)
所以 .net standard的选择原则就是:在API够用的情况下选择尽量低的 .net standard标准。这需要根据实际的项目需求来进行判断。
了解了TFMs和 .net standard后我们绕回来说NuGet,创建一个 .net standard 2.0 类库项目。
打开csproj我们可以看到
<Project
可以看到TargetFramework是netstandard2.0。如果我们需要更改TargetFraamework,可以选择项目【属性】在【应用程序】页面可以进行更改。
为了演示我们为项目添加一个第三方包Newtonsoft.Json,右键点击项目选择管理NuGet程序包。
打开后可以在Visual Studio左侧看到下面的界面。
这里显示了项目已安装的包,这个包由我们选择的Target Framework隐式引用的。现在我们点击浏览,搜索Newtonsoft.Json。
点击安装。
安装完成后可以看到程序包管理器输出以下信息,并且引用中也添加了新的项目。
但是我并没有在项目文件夹下找到任何Newtonsoft.Json的程序集,包在哪?其实包被下载到了一个nuget公共目录,在我的Windows10系统上是 C:Userswangl.nugetpackages,这样nuget包就不会被重复下载。而在项目中nuget仅仅将依赖信息写入了csproj项目文件与obj文件夹中的project.assets.json,其中csproj项目文件中的内容如下。
<Project
包所依赖的内容并不会被打包到最后的.nupkg文件中,NuGet只是将依赖信息写入包,在最终使用这些包的应用程序编译时还原所有的依赖。
至此我们简单了解了NuGet给项目添加引用的过程。对于更复杂情况的引用,如下图
这个项目的依赖树中有三个对B包的引用,而三个包的版本要求可能是不相同的,但幸好我们只需要关心我们项目直接引用的包,因为Nuget会帮我们管理所有包的依赖并且对于被多次引用的包,Nuget会找出满足该包所有使用者的版本(不过因为版本要求冲突而找不到适合包的情况是有可能的)。如果需要更详细的了解nuget如何解析项目包的引用可以前往下面的链接。
NuGet Package Dependency Resolutiondocs.microsoft.com
现在开始打包我们的类库项目,首先要为包设置一些诸如版本,作者等相关信息。右键点击项目选择【属性】,再选择【打包】页,可以在这里输入包的描述信息。
打开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中安装。
到此我们成功创建了一个NuGet包。
下篇内容包括如何将包上传到NuGet Gallary(NuGet官方库)以及更深入的了解NuGet平台。
最后附上NuGet官方文档。
NuGet Documentationdocs.microsoft.com
本文的目的是记录与分享自己的学习过程和个人你的看法。如果对你有任何帮助深感荣幸,若有任何纰漏烦请指正。如有任何问题请在评论里留言,我会尽量解答。
无法使用此安装程序来安装 .net framework_NuGet是什么?理解与使用(上)相关推荐
- 计算机无法启动安装程序,win7电脑无法安装程序或安装的程序不能运行怎么办...
win7电脑无法安装程序或安装的程序不能运行怎么办?在计算机的操作.运行中,难免遇到应用程序无法安装或者无法正常启动运行的问题,这对我们使用计算机带来了很大的不便,而各种不同的程序不能正常运行,又不可 ...
- 用inno setup做的安装程序,安装过程中被360报如下风险
用inno setup做的安装程序,安装过程中被360报如下风险,请问大家有碰到过没有? 我看了下,好像就是最后生成卸载程序时报出来的,在将setup.tmp拷到unins000.exe时,360认为 ...
- c#打包安装程序默认安装路径设置
c#打包安装程序默认安装路径设置
- 用 .Net Framework 4.0 制作的安装程序来安装 .Net Framework 4.0 编写的程序
文章题目看起来有点绕,解释一下,假如你基于框架写了一个程序,想装到客户机上,但是客户机上可能并没有安装框架,因此你的程序需要预先将框架安装在目标机上,然后再执行一些安装程序的标准功能,如创建快捷方式. ...
- win10安装sql server2000卡住在“安装程序正在安装 Microsoft 数据访问组件 (MDAC)...
win10安装sql server2000卡住在"安装程序正在安装 Microsoft 数据访问组件 (MDAC)...",这个问题之前遇到过几次,每次处理的结果都是大同小异,现在 ...
- 安装驱动时,错误提示:类别安装程序拒绝安装或更新此设备
今天在给公司的一台HP CM1312 MPF激光一体机安装驱动,扫描仪的驱动出了问题,怎么也装不上,提示"类别安装程序拒绝安装或更新此设备".意识找不到解决办法.所以就去找Goog ...
- VS2008 SP1制作安装程序离线安装.Net Framework3.5
VS2008 SP1制作安装程序离线安装.Net Framework3.5 這兩天都在弄一個 Windows Setup 專案,希望弄得盡善盡美,直到剛剛終於大功告成,但當我想將 .Net Frame ...
- 系统无法在此计算机硬件上运行,Windows安装程序无法将配置未在此计算机的硬件上运行的解决方案-太平洋电脑网...
"Windows安装程序无法将Windows配置未在此计算机的硬件上运行",在PE下重装Win7 64位系统的时候出现这个提示是不是让遇到此问题的你十分崩溃? 经过在多台机N次的重 ...
- 笔记本linux蓝牙驱动怎么安装程序,如何安装蓝牙设备的驱动程序
操作步骤: 此处以Lenovo S41-70笔记本 Windows8.1系统为例介绍安装蓝牙驱动方法. 1.判断机器是否已安装蓝牙驱动,可以从桌面上找到"计算机"图标,右键选择&q ...
- office linux 安装程序,如何安装Office2016 64位安装包?只安装3件套!
本篇文章给大家带来的内容是关于如何安装Office2016 64位安装包,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1. 64位安装包制作 Office2016的iso安装包2. ...
最新文章
- java 匿名内部类
- vSphere可用性之三准备实验环境
- 1250 Fibonacci数列(矩阵乘法快速幂)
- 通过Dapr实现一个简单的基于.net的微服务电商系统(二)——通讯框架讲解
- 小公司出来的产品经理被大厂鄙视?
- JEECG_3.7.2新版本入门讲解—UI标签库专题-张代浩-专题视频课程
- mysql语法中的join_MySQL JOIN 语法说明与 图解
- 因代码不规范,码农枪击4名同事,一人情况危急
- 移动管理进步显著 企业仍然面临风险
- Java NIO框架Netty教程(三) – Object对象传递
- linux 编译mtk无线驱动,Linux驱动(七)----MTK驱动注册分析
- 一建已经过去,正是中级通信工程师黄金备考期!
- 三年开发三年管理,三个月努力5A成绩通过PMP就在51CTO!
- 古马其顿国王-亚历山大
- oracle jpg格式导出,格式记RAW,另存或导出就是JPG格式,就这么很简单
- 36 个JS 面试题为你助力金九银十(面试必读)
- 异或、或、与(且)的运算
- linux正则表达式与文本处理工具
- KindEditor实现多图片上传
- 服务器硬盘故障问题有哪些
热门文章
- 程序员过关斩将--要想获取我的用户信息,就得按照规矩来
- NopCommerce 4.2的安装与运行
- 【18】ASP.NET Core MVC 中的 Model介绍
- kubernetes 客户端KubeClient使用及常用api
- 实用帖 | 使用Visual Studio开发.NET Core推荐设置
- 微软Windows Community Toolkit一览
- ABP .Net Core Entity Framework迁移使用MySql数据库
- redis watch使用场景_redis不得不会的事务玩法
- 3d数学基础图形与游戏开发 英文版_1850款文字标题字幕条,AE图形预设包,logo生成神器...
- [转]Xdebug----Failed loading