nuget 是如何还原包的

Intro

一直以来从来都是用 nuget 包,最近想折腾一个东西,需要自己搞一个 nuget 包的解析,用户指定 nuget 包的名称和版本,然后去解析对应的 nuget 包并添加引用到项目,

于是就想搞明白 nuget 包是怎么还原的,对于本地已经下载了的 nuget 包又是怎么找的

Nuget 包的引用

对于 dotnetcore 项目(这里不算之前那种 project.json 的项目,只讨论 *.csproj 这种项目),都是使用新的项目格式,PackageReference 模式

示例:

<PackageReference Include="WeihanLi.Common" Version="1.0.39" />

对于 dotnet framework 项目,如果使用 PackageReference 包格式和上面一样,如果是传统的 packages.config 包形式,会有一个 packages.config 的文件包含引用的 nuget 包,文件内容示例:

<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="net452" />
</packages>

本文主要说明 dotnetcore 这种 PackageReference 这种形式

nuget 包的还原

nuget 包在第一次从 nuget.org 或自己的包源上下载之后会存放在本地的一个文件夹中,下次再需要相同版本的包还原时就会直接从本地的包中获取,而这个保存的文件夹是 nuget 配置的一部分,在网上可以找到一些修改 nuget 默认保存 packages 文件夹的位置,但是这些文章都很类似,都只是给出了一个解决方案然而并没有说明为什么要这么做,这么做的根据是什么并没有说明,其实这种解决方案是添加了一个默认的 nuget 配置文件,修改了 nuget 包保存的位置

nuget 配置

默认配置

nuget 会有一些默认的配置,可以参考官方文档: https://docs.microsoft.com/en-us/nuget/reference/nuget-config-file#config-section

nuget 配置中有一个 globalPackagesFolder 的配置,是用来指定默认的 nuget 包保存的位置,在 Windows 上默认的保存位置是 %userprofile%\.nuget\packages,在 Linux/Mac 上默认的保存位置是 ~/.nuget/packages,可以使用 nuget.configNuGet.Config 配置文件来修改默认的保存文件,除此之外,还可以通过环境变量的方式,配置 NUGET_PACKAGES 来修改默认 nuget 包保存的位置

默认配置文件

nuget 配置的默认配置文件,官方文档:https://docs.microsoft.com/en-us/nuget/reference/cli-reference/cli-ref-config#options

Windows 上默认配置文件的位置是 %AppData%\NuGet\NuGet.Config 这也是现在网上那些修改默认保存 nuget 包位置的解决方案,

Linux/Mac 上大多是 ~/.config/NuGet/NuGet.Config,有的可能是 ~/.nuget/NuGet/NuGet.Config(和系统版本有关系)

Windows 上默认是没有这个配置文件的,添加这个默认配置文件之后就是全局作用的

Reference

nuget 包是如何还原包的的更多相关文章

  1. VS项目中使用Nuget还原包后编译生产还一直报错?

    Nuget官网下载Nuget项目包的命令地址:https://www.nuget.org/packages 今天就遇到一个比较奇葩的问题,折腾了很久终于搞定了: 问题是这样的:我的解决方案原本是好好的 ...

  2. 已使用.netframework,version=v4.6.1 而不是目标框架netcoreapp,version=v2.1 还原包,此包可能与项目不完全兼容

    已使用.netframework,version=v4.6.1 而不是目标框架netcoreapp,version=v2.1 还原包,此包可能与项目不完全兼容 NU1202: 包 System.Run ...

  3. 使用NuGet发布自己的类库包(Library Package)

    STEP 1:注册并获取API Key 首先,你需要到NuGet上注册一个新的账号,然后在My Account页面,获取一个API Key,这个过程很简单,我就不作说明了. STEP 2:下载NuGe ...

  4. zh-Hans vs.net 通过 管理nuget程序包下载简体中文语言包 zh-cn

    zh-Hans  vs.net 通过 管理nuget程序包下载简体中文语言包 在搜索中输入:zh-hans

  5. Docker在Linux上运行NetCore系列(四)使用私有Nuget与多个本地包引用运行ASPNetCore

    转发请注明此文章作者与路径,请尊重原著,违者必究. 本篇文章演示了使用Dockerfile在Linux(ubuntu16.04)系统上构建ASPNetCore应用,并且在一个解决方案中存在多个项目之间 ...

  6. VS NuGet加载本地程序包

    NuGet是VS中非常实用的一个工具,我们可以通过它在线安装想要的程序包,只要右键点击解决方案中的项目的引用,在弹出的菜单中选择“管理NuGet程序包”,然后就可以通过在线搜索找到想要添加的程序包,下 ...

  7. 以太网数据包、IP包、TCP/UDP 包的结构(转)

    源:以太网数据包.IP包.TCP/UDP 包的结构 版本号(Version):长度4比特.标识目前采用的IP协议的版本号.一般的值为0100(IPv4),0110(IPv6). IP包头长度(Head ...

  8. PHP读取APK的包信息,包括包名,应用名,权限,LOGO等

    [转]PHP读取APK的包信息,包括包名,应用名,权限,LOGO等 声明本文转自: 原文链接:https://www.jb51.net/article/53780.htm: 感谢分享! <?ph ...

  9. 《连载 | 物联网框架ServerSuperIO教程》- 9. 协议过滤器,解决一包多发、粘包、冗余数据

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

随机推荐

  1. [Abp vNext 入坑分享] - 8.Redis与Refit的接入

    前言 本章结束之后,这个abp vnext系列算是初步完结了,基础的组件都已经接入了.如果各位还需要其它的组件的话,可以自己按需要进行接入使用.其实这个只是一个基础的框架,可以自己根据需要进行变通的. ...

  2. 在win10上搭建pyspark,

    最近在研究Spark,准确的说是pyspark,为了搭个测试环境,之前一直在云上开Linux机器来搭Hadoop,但是Spark可以Local执行,我就打算在本地搭个环境.遇到了一些问题,记录一下,也 ...

  3. 引入mybatis-plus报 Invalid bound statement错误怎么办,动动手指改一个地方就行

    错误 Mybatis-Plus (简称MP) 是mybatis的一个增强工具,在mybatis的基础上只做增强不做改变,简化了开发效率.其实就是帮我们封装了一些简单的curd方法,可以直接调用,不必再 ...

  4. [ES6系列-01]Class:面向对象的“新仇旧恨”

    [原创]CoderPower 大家好,这里是码路工人有力量,我是码路工人,你们是力量. 这是公众号(码路工人有力量)开通后的第二篇,写得还是有待改进吧.这次准备写一个关于ES6基础的短文系列,努力尽快 ...

  5. React-Native 爬坑爬坑

    出现函数找不到问题一般都是this的指向问题,一般是用箭头函数解决,解决不了就传入this 在setState里面一定不能要直接写state引入的值,如: this.setState({now: th ...

  6. 一个 static 还能难得住我?

    static 是我们日常生活中经常用到的关键字,也是 Java 中非常重要的一个关键字,static 可以修饰变量.方法.做静态代码块.静态导包等,下面我们就来具体聊一聊这个关键字,我们先从基础开始, ...

  7. 关于使用npm成功安装命令后,执行时却报找不到命令的问题

    # 使用npm安装newman命令 ~$ npm install newman --global ... /root/node-v6.9.1-linux-x64/bin/newman -> /r ...

  8. python数据类型 列表+元组

    一:列表 二:元组 一:列表list: 1.列表中的每个元素都可变的,意味着可以对每个元素进行修改和删除: 2.列表是有序的,每个元素的位置是确定的,可以用索引去访问每个元素: 3.列表的所有元素放在 ...

  9. ASP.NET通过EntityFramework CodeFirst创建数据库

    Number1 新建一个项目 给新项目添加一个实体数据模型 选择第三个 这里我创建两个有关系的类,也就是有外键关系的数据库表 using System; using System.Collection ...

  10. Java实现 蓝桥杯 算法提高 概率计算

    算法提高 概率计算 时间限制:1.0s 内存限制:256.0MB 问题描述 生成n个∈[a,b]的随机整数,输出它们的和为x的概率. 输入格式 一行输入四个整数依次为n,a,b,x,用空格分隔. 输出 ...