Hibop.github.io icon indicating copy to clipboard operation
Hibop.github.io copied to clipboard

关于npm正确打开姿势——镜像代理、配置注册、版本号、script

Open Hibop opened this issue 7 years ago • 3 comments

npm获取配置有6种方式,优先级由高到底

  1. 命令行参数。 --proxy http://server:port即将proxy的值设为http://server:port。

  2. 环境变量。 以npm_config_为前缀的环境变量将会被认为是npm的配置属性。如设置proxy可以加入这样的环境变量npm_config_proxy=http://server:port。

  3. 用户配置文件。可以通过npm config get userconfig查看文件路径。如果是mac系统的话默认路径就是$HOME/.npmrc。

  4. 全局配置文件。可以通过npm config get globalconfig查看文件路径。mac系统的默认路径是/usr/local/etc/npmrc。

  5. 内置配置文件。安装npm的目录下的.npmrc文件。

  6. 默认配置。 npm本身有默认配置参数,如果以上5条都没设置,则npm会使用默认配置参数。

npm镜像设置:

常用镜像:

default

npm set registry  https://registry.npm.taobao.org
// 或者
npm config set registry  https://registry.npm.taobao.org

// 验证
npm config list

npm 版本号:

语义化版本(Semantic Versioning)命名方式, 简称 SemVer。

<major>.<minor>.<patch>-<stage>.<num>
  • major:主版本号(大版本),无需向下兼容
  • minor: 次版本号(小版本), 必须向下兼容
  • patch: 补丁号(bug修复)
  • -stage.1: 预发版本号(tag版本): 不稳定版本, stage选用alpha、bata、rc;
  • 版本号前不要加 v, 数字前不加0, +1递增, 1.0.0版本前内部开发;

版本号范围(version range)

  • 通配符: x、*;
  • 模糊符: ^、~;
  • 连接符: -;
  • 比较符: >=,< image 当运行 npm update 时,依赖的包将升级到版本号范围支持的最高版本。 建议在写法上采用 「使用通配符的写法」,并且一般情况下 「跟进每个小版本更新」,但 不「始终升级到最新版」,即书写为 1.x。 位版本不向下兼容的,一般采用人为干预以保证安全。

私有镜像搭建:

工具: sinopia verdaccio 搭建内网私有镜像,一般逻辑流程: default

verdaccio&sinopia搭建私有镜像的采坑之路:

由于sinopia的作者已于二年前停止对sinopia的维护和升级,所以出来了一个sinopia的fork,名字叫做Verdaccio,然后由Verdaccio继续对sinopia进行更新和维护,具体如何使用Verdaccio来构建私有npm服务器。sinopia可以修改源码,Verdaccio跑起来的是编译后的包,改完源码需要自己编译。

主要记录下使用verdaccio的坑:

  • 安装node npm, 安装verdaccio,npm i -g verdaccio 当前使用的版本是2.7.4,安装过程中可能会报python.exe什么鬼的错,然鹅,好像没什么影响
  • 安装好了以后,就可以在命令行输入verdaccio,启动 verdaccio必须是全局变量(windows下不需要其他操作,linux下,如果node npm之类是通过ln -s进行软连接,verdaccio也要软连接才可全局使用, 一般需要配置环境变量/etc/profile目录下,配置完source一下restart)
  • 如果需要更改配置,可以找到config.yaml文件(windows在C:Users用户名AppDataRoamingverdaccio的文件夹,linux在/用户名(root)/.config/verdaccio文件夹,以上路径仅供参考),可以对registry的路径啥的进行配置,需要注意的是,如果是要通过IP访问私库,需要在配置文件中加入listen: 0.0.0.0:4873,否则就会报ECONNREFUSED的错误。
  • 连接到私库进行依赖包的下载,会先查找本地有没有缓存,私库有没有缓存,如果都没有,则会从配置文件中的设置的registry中进行下载(网上下载),并把安装包下载到verdaccio/storage中。
  • 以上是网络没有被限制的情况,很友好很友好,第二次下载的速度也是很快。然鹅,这个私库是要部署到服务器上的,网络是被限制的,要访问的IP只能申请,批准了才能开,申请了registry.npm.taobao.org的IP,但是有些依赖包是从cdn.npm.taobao.org上下载,不能访问cdn.npm.taobao.org就会报internal server error和uplink is offline的错误。这就真没法申请那么多IP访问了,所以!!!只能离线!!!把需要的依赖包的安装包缓存起来,放在服务器上的/verdaccio/storage中,就可以完美实现离线安装了。 具体实现:在无网络限制的电脑中安装verdaccio,并把npm的registry连接到verdaccio(例如:npm config set registry=http://localhost:4873,或者使用nrm),先清除npm缓存(npm cache verify),在还未安装依赖包的项目中npm install,成功后,把/verdaccio/storage整个拷贝到服务器的verdaccio/storage。 至此,可以成功连接服务器上的私库下载依赖包了。

下载带@ 符号的包都下载失败,比如下载 @angular/core,下载失败bug 查阅了一些资料,发现这其实是Sinopia自己的bug,bug产生的原因就是:sinopia在代理到npmjs.org公有库时将@符号转码为%40,致使在公有库中找不到对应的包,返回404 ,简单点说就是 @angular/core 代理请求的时候被转换成了 %40angular/core,所以我们需要在代理请求发出之前将其转回 @angular/core。修改sinopia源码:修改位于sinopia/lib/up-storage.js文件第10行:将var encode = encodeURIComponen;,更改为:var encode = function(thing) {return encodeURIComponent(thing).replace(/^%40/, '@');}; ,这段代码的含义就是将%40转回@,于是就解决了不能下载带有@符号的npm包的bug。

解决方案

现有类似服务和方法

  • npm+git(git+ssh://dependencies)- 许多人这么用,但是有个麻烦问题,npm update 不能更新,不能以这种方式用git子目录等。
  • reggie - 这看起来确实非常有趣。可以借用一些代码。
  • shadow-npm,public service - 它使用了与npmjs.org相同的代码。
  • gemfury和其他服务 - 这些都是闭源的云服务。
  • npm-registry-proxy,npm-delegate,npm-proxy。 - 这些只是代理

npm 代理

npm config set proxy http://server:port
npm config set https-proxy http://server:port

代理需要认证的话

npm config set proxy http://username:password@server:port
npm config set https-proxy https://username:password@server:port

取消代理

npm config delete proxy

Hibop avatar Jun 15 '18 06:06 Hibop

我是用sinopia搭建的 然后遇到了@符号的问题 可是没有找到sinopia/lib/up-storage.js这个文件呢 你有找到过这个文件吗

xuiwife avatar Oct 23 '18 07:10 xuiwife

npm获取配置有6种方式,优先级由高到底,5的优先级比3和4的高吧,用户项目内.npmrc > 用户目录.npmrc > 全局.npmrc

hoasou avatar Mar 23 '21 06:03 hoasou

实测发现,还有一种优先级比3、4、5更高的配置方式,npm install --registry=http://xxx

hoasou avatar Mar 23 '21 07:03 hoasou