在离线环境使用nuget包
原来程序集的引用
一个项目所有功能我们不可能都自己写对吧。这个时代 引用一大片的第三方包 项目源文件几百兆 ,有可能第三方包占了总体积99%。有可能我们自己写的代码不过几十行。想想我们原来的 老时代的 ,如何引用一个第三方的组件,新建项目 项目节点上 右键 添加dll引用:
然后 在代码里你就可以编写代码,有的还有可能额外的给你加点啥配置文件:
1 static void Main(string[] args)
2 {
3 List<int> ali = new List<int>() { 1, 2, 5, 65, 23 };
4 string serialStr = JsonConvert.SerializeObject(ali);
5 Console.WriteLine(serialStr);
6 }
为什么你知道这样用 因为第三方库官方的使用方式就是这么写的。
新的方式
上面那一套有些跟不上时代了。在python里你都看到 install xxx ,instal xxx 一句话解决。vs也有 那就是 nuget 。直接打开程序包管理器控制台:
PM> Install-Package Newtonsoft.Json
正在尝试收集与目标为“.NETFramework,Version=v4.6.1”的项目“ConsoleApp2”有关的包“Newtonsoft.Json.13.0.3”的依赖项信息
收集依赖项信息花费时间 45.89 ms
正在尝试解析程序包“Newtonsoft.Json.13.0.3”的依赖项,DependencyBehavior 为“Lowest”
解析依赖项信息花费时间 0 ms
正在解析操作以安装程序包“Newtonsoft.Json.13.0.3”
已解析操作以安装程序包“Newtonsoft.Json.13.0.3”
从“nuget.org”检索包“Newtonsoft.Json 13.0.3”
GET https://www.nuget.org/api/v2/package/Newtonsoft.Json/13.0.3
OK https://www.nuget.org/api/v2/package/Newtonsoft.Json/13.0.3 1996 毫秒
正在安装 Newtonsoft.Json 13.0.3。
正在将程序包“Newtonsoft.Json.13.0.3”添加到文件夹“C:\Users\真红\Source\Repos\ConsoleApp2\packages”
已将程序包“Newtonsoft.Json.13.0.3”添加到文件夹“C:\Users\真红\Source\Repos\ConsoleApp2\packages”
已将程序包“Newtonsoft.Json.13.0.3”添加到“packages.config”
已将“Newtonsoft.Json 13.0.3”成功安装到 ConsoleApp2
执行 nuget 操作花费时间 7.87 sec
已用时间: 00:00:09.5098825
PM>
或者直接使用图形化方式选择安装:
在离线环境使用nuget
如果在外网新建项目 然后安装了某些 nuget包 ,你的.sln 文件同级目录会有个packages文件夹,那么整个解决方案直接拷贝到内网 直接就可编译(其实背后本质也是引用dll 然后你nuget安装 就自动帮你完成了,你可以理解为这些依赖关系和配置文件规格等等信息在nuget包里已经定义好了 然后你执行nuget安装时帮你转达完成),没错就是你项目右键 添加引用 选dll文件,只不过nuget帮你完成这一过程。我们可以把packages文件夹 内的组件搜集到一起 供内网新建项目时 其他项目进行引用。首先把packages里的组件搜集到一个统一文件夹。然后工具->nuget包管理器->管理解决方案的nuget程序包。在程序包源那 设置那里加 本地搜集的目录。这时浏览选项卡就可以看到组件列表了。
然后选择像常规方式一样安装到内网新建的项目就可以了。
安装后会在项目生成 一个packages.config 里面有项目安装了的对应的包的项。
并不只是添加dll程序集引用 ,对于要在app.config添加一些奇奇怪怪配置项的 ,如果有nuget包 会自动帮你完成。比如sqlite 的provider配置项 。否则的化你需要对那个组件非常了解(有可能组件不止一个dll,有可能有些未知的配置项你手敲不一定敲的对,有可能依赖最低.net版本或者依赖另一个组件等等)
这整个过程无需连外网。
概念总结和注意项
注意我们整个过程:在外网安装并搜集所有的包->拷贝包到离线环境->设置离线环境nuget源为拷贝的路径->像常规一样使用包文件nuget又从本地源安装到项目目录下。 nuget安装完成后 整个工程的状态 就跟你原来添加dll引用 完成后整个工程的状态一样了, 你可以理解为这个时候不存在nuget。nuget安装并没有什么跟原来特别不一样的项目结构更改方式。项目不能编译就是不能编译 不要扯什么nuget 跟nuget 无关。
- 我能把packages包拷到 项目文件夹下 ,然后编辑packages.config 然后编译时他就会自动去找对应的文件进行编译吗?不要形成拷贝nuget包到本地 改配置文件 就能重新编译了的错误概念。这个理解是完全错的。抱歉,编译时不会进行nuget任何操作 不会进行加dll引用这种操作。原先nuge安装了模块的项目 那么引用是自动加好了的,那么整个项目拷到内网 一样可编译。
- 内网唯一能做的 找内网nuget源 安装模块,也不存在什么原来安装了 现在丢失了 需要重新安装的说法。
- nuget不需要所谓服务器的说法:本地你指定个文件夹就可以当作源。
由此带来的思考
这又是我擅长的环节了,写代码不咋行,扯闲淡讲经布道指点江山一套一套的。为什么? 我们直接手工点来点去 项目上右键 添加dll引用 ,有什么不好 ,有些人会说 不是挺好的吗?确实 ,不要强行装逼 ,这样没什么不好的 因为手工点来点去显得很low所以就不好吗?
但是为什么又要发展成nuget发展成命令行安装这样?一切都是软件工业技术发展过后人的思维的使然 :当一个东西大了后自然需要规范化 统一化 自动化。跟其他工业技术一样的,没什么好说的。
当你达到一定经验后 你就会幡然醒悟 :其实本质不是事情有什么不好 或者什么不能完成。
站在更高维度看代问题的时候 就会明白:核心思想在于统一规范和自动化,命令行可以通过脚本 自动化 连接所有过程,这个对于大型项目 是很重要的。
注意平常我们说的 编译器是编译器 ,开发环境是开发环境 ,构建工具是构建工具,构建工具就是帮你把大型软件从源码生成至用户可用的执行文件,这一切需要统一规范和自动化命令行连接作为支撑。 只不过vs帮你把所有东西搞到一起了。
如果有人跟你这么说这么做 但是又说不出原因 因为大家都这样 那么他在装逼。
在离线环境使用nuget包的更多相关文章
- 离线环境使用NuGet
更新记录 本文迁移自Panda666原博客,原发布时间:2021年5月13日. 在Visual Studio中直接使用GUI的方式操作NuGet包非常的方便.如果喜欢命令行,也可以使用包管理控制台或者 ...
- 关于liunx 机器脱机环境(netcore)Nuget包迁移的问题
首先nuget脱机环境是没办法加载第三方nuget包的,我这里的做法是使用nuget缓存文件(正确的做法还是推荐使用自己搭建的nuget服务器然后正常发布,这里只是做应急之需) 我们都知道项目的dot ...
- 容器环境下如何将NuGet包XML文档添加到Swagger
容器环境下将NuGet包XML文档添加到Swagger 在.NET Core项目开发过程中,为了实现代码复用,我们将可以重复使用的部分拆分成一个个小的NuGet包.这些NuGet包可以在其他系统中复用 ...
- vs code .net core Linux下离线安装Nuget包
本人第一次使用 vs code在linux下开发.net core项目,由于处于内网,无法通过在线安装,所以在遇见离线安装Nuget包时,耗费了一番功夫,网上也没有相关的,最后还是多个思路结合才解决的 ...
- .NET Core 环境下使用命令行移除某个 nuget 包的具体方法
.NET Core 使用Nuget包一般是先写入csproj文件,然后下载保存在\bin\Debug\netcoreapp2.0\publish\下,所以可以采用如下方案进行删除操作(其中netcor ...
- 生产环境项目问题记录系列(二):Docker打包镜像Nuget包因权限问题还原失败
docker打包镜像遇到一个因为nuget权限验证问题导致镜像打包失败的问题,公司Nuget包用的是tfs管理的,tfs有权限验证,结果导致nuget还原失败,原有的NuGet.config文件如下: ...
- 在离线环境中使用.NET Core
在离线环境中使用.NET Core 0x00 写在开始 很早开始就对.NET Core比较关注,一改微软之前给人的印象,变得轻量.开源.跨平台.最近打算试着在工作中使用.但工作是在与互联网完全隔离的网 ...
- 在离线环境中安装Visual Stuido 2017
在离线环境中安装Visual Stuido 2017 0x00 写在前面的废话 因为工作上大多数都是在离线环境中进行的,进出离线环境很麻烦,所以之前很长一段时间都在使用VS2010.后来尝试换了VS2 ...
- 使用NuGet发布自己的.NET NuGet 包( .NET Standard & Windows)
发布自己的nuget包 STEP 1:获取API Key 首先,你需要到NuGet上注册一个新的账号,然后在My Account页面,获取一个API Key,或者是自建服务器上生成一个API Key( ...
- 离线pip下载Python包
离线pip下载Python包 这几天搞Windows离线断网环境下安装Python包,配置环境,各种坑!做个记录,供以后查询吧. # 生产环境 windows xp# python 2 ...
随机推荐
- ubuntu 安装使用 mytop
apt搜索一下 $ sudo apt search mytop Sorting... Done Full Text Search... Done mytop/focal,focal,now 1.9.1 ...
- Java中使用FFmpeg拉取RTSP流
在Java中使用FFmpeg拉取RTSP流并推送到另一个目标地址是一个相对复杂的任务,因为Java本身并没有直接处理视频流的功能.但是,我们可以借助FFmpeg命令行工具来实现这个功能.FFmpeg是 ...
- Java GC 调试手记
摘要 本文记录GC调试的一次实验过程和结果. GC知识要点回顾 问题1:为什么要调试GC参数?在32核处理器的系统上,10%的GC时间导致75%的吞吐量损失.所以在大型系统上,调试GC是以小博大的不错 ...
- Java多线程设计模式之线程池模式
前序: Thread-Per-Message Pattern,是一种对于每个命令或请求,都分配一个线程,由这个线程执行工作.它将"委托消息的一端"和"执行消息的一端&qu ...
- Hook框架之Frida
Frida是一款轻量级HOOK框架,可用于多平台上,例如android.windows.ios等. frida分为两部分,服务端运行在目标机上,通过注入进程的方式来实现劫持应用函数,另一部分运行 ...
- cmu15545笔记-并发控制总结(Concurrency Control Summary)
目录 总览 ACID 串行化与冲突操作 隔离级别 概念层级 二阶段锁 原理 级联回滚 强二阶段锁 死锁检测和避免 锁层级 实践应用 实现的隔离级别 OOC 原理 三个阶段 实现的隔离级别 处理幻读 M ...
- Javascript 标签的属性
1.为HTML标签设置和添加属性 setAttribute() setAttribute()方法可以给HTML标签设置/添加属性(原生的属性或者自定义的属性都可以)添加的属性会存储在标签中 <! ...
- Postgresql——postgis安装
PostGIS安装 PostGIS 是一个开源数据库拓展,它为 PostgreSQL 数据库增加了对地理空间数据的支持.PostGIS 使得空间数据的存储.查询和分析变得简单高效. PostGIS 是 ...
- 特性Attribute的简单用法
一.建立一个自定义的Attribute类 注:类名+Attribute,类需要继承Attribute /// <summary> /// 特性 /// </summary> p ...
- PDFsharp 1.50
PDFsharp 1.50 Preview Information - PDFsharp & MigraDoc PDFShapr 1.50 修复与改进 支持 Object Streams - ...