--{module_name}_binary_host_mirror--{module_name}_binary_site

demo

// .npmrc文件
sass_binary_site=https://npmmirror.com/mirrors/node-sass/
nodejieba_binary_host_mirror=https://npm.taobao.org/mirrors/nodejieba

gyp

gyp全称Generate Your Projects(构建你的项目)

node-gyp

抹平了不同平台之间的差异(比如mac和windows),将源代码编译为可执行的二进制文件。由于某些npm包底层是使用C++/C这种依赖平台的代码,比如node-sass。所以就不能直接像其他普通包一样从npm中直接下载文件到本地,而是需要将源代码拉下来使用node-gyp将源代码编译为可执行的二进制文件。

node-pre-gyp

每次安装包都需要使用node-gyp本地构建,这样很麻烦。库开发者将编译好的各种平台的二进制包发布到node-pre-gyp中,用户进行install时会首先根据本地的环境看远端是否有编译好的二进制文件,如果有就直接使用编译好的二进制文件。如果没有则本地使用node-gyp编译生成本地的可执行二进制文件。

如何指定二进制包的位置

使用package.json文件的binary字段指定。

binary: {
...
}

指定的位置网络被墙,比如github。使用--{module_name}_binary_host_mirror

// .npmrc文件
nodejieba_binary_host_mirror=https://npm.taobao.org/mirrors/nodejieba

什么时候使用--{module_name}_binary_host_mirror

使用node-pre-gyp包的就需要使用binary_host_mirror,因为node-pre-gyp内部在install时会优先读取npm config中配置的binary_host_mirror。并且module_name的值为包的package.json中配置的"binary.module_name"的值。

sqlite3举例:

sqlite3package.json文件

{
"binary": {
"module_name": "node_sqlite3",
"module_path": "./lib/binding/napi-v{napi_build_version}-{platform}-{libc}-{arch}",
"host": "https://github.com/TryGhost/node-sqlite3/releases/download/",
"remote_path": "v{version}",
"package_name": "napi-v{napi_build_version}-{platform}-{libc}-{arch}.tar.gz",
"napi_versions": [
3,
6
]
},
"scripts": {
// ....
"install": "node-pre-gyp install --fallback-to-build",
//...
},
}

执行npm i sqlite3时会首先从npm中下载sqlite3的源代码,下载完后检测到源码的package.json中的script标签中有install指令,就会执行install,执行node-pre-gyp install --fallback-to-buildnode-pre-gypnode_modules/.bin/node-pre-gyp中,执行node-pre-gyplib/main.js文件。

这里的install命令在js中可以使用process.argv[2]process.argv[3]分别读取到install--fallback-to-buildprocess.argv[0]的值为nodejs可执行文件所在的位置,process.argv[1]的值为当前执行的 JavaScript 文件所在的路径。从2开始都是命令行参数了。

node-pre-gyp中下载预编译二进制文件的代码

const opts = {
// ...
module_name: package_json.binary.module_name,
}
const validModuleName = opts.module_name.replace('-', '_');
const host = process.env['npm_config_' + validModuleName + '_binary_host_mirror'] || package_json.binary.host;

可以通过process.env读取npm的config,比如读取registryprocess.env.npm_config_registry

所以这里的host优先从npm config里面去读binary_host_mirror,其中的module_name的值为包的package.json文件中的"binary.module_name"字段。

什么时候使用--{module_name}_binary_site

node-sasspackage.json文件:

{
"nodeSassConfig": {
"binarySite": "https://github.com/sass/node-sass/releases/download"
},
"scripts": {
// ...
"install": "node scripts/install.js",
// ...
},
}

使用npm i node-sass安装node-sass时会先从npm中下载node-sass的源码。源码下载完成后检测到script中有install命令,如何执行install命令。

scripts/install.js文件

function checkAndDownloadBinary() {
var cachedBinary = sass.getCachedBinary(),
cachePath = sass.getBinaryCachePath(),
binaryPath = sass.getBinaryPath();
// 下载二进制可执行文件
download(sass.getBinaryUrl(), binaryPath, function(err) {
// ....
});
} // If binary does not exist, download it
checkAndDownloadBinary();

调用checkAndDownloadBinary方法进行下载预编译文件。

getBinaryUrlgetArgument函数:

function getArgument(name, args) {
var flags = args || process.argv.slice(2),
index = flags.lastIndexOf(name); if (index === -1 || index + 1 >= flags.length) {
return null;
} return flags[index + 1];
} function getBinaryUrl() {
var site = getArgument('--sass-binary-site') ||
process.env.SASS_BINARY_SITE ||
process.env.npm_config_sass_binary_site ||
(pkg.nodeSassConfig && pkg.nodeSassConfig.binarySite) ||
'https://github.com/sass/node-sass/releases/download'; return [site, 'v' + pkg.version, getBinaryName()].join('/');
}

下载预编译文件时优先使用在命令行中指定的--sass-binary-site。比如:npm install node-sass --sass-binary-site=https://npmmirror.com/mirrors/node-sass/

其次使用环境变量中指定的SASS_BINARY_SITE。比如:export SASS_BINARY_SITE=http://example.com/

再然后就是读取npm配置(常用的是.npmrc文件)中的sass_binary_site,通过process.env.npm_config_sass_binary_site读取。

再然后读取package.json中配置的binarySite字段。

{
// ...
"nodeSassConfig": {
"binarySite": "https://github.com/sass/node-sass/releases/download"
},
// ...
}

最后就是一个写死的github地址'https://github.com/sass/node-sass/releases/download'

总结:

要安装的包如果使用了node-pre-gyp(比如nodejieba),在.npmrc文件中配置国内预编译文件镜像URL就需要使用--{module_name}_binary_host_mirror。其中的module_name的值为包的package.json中配置的"binary.module_name"的值。

什么时候使用--{module_name}_binary_site实际是由要安装的包内部自己实现的,典型的案例就是node-sass

--{module_name}_binary_host_mirror和--{module_name}_binary_site的更多相关文章

  1. node-pre-gyp以及node-gyp的源码简单解析(以安装sqlite3为例)

    title: node-pre-gyp以及node-gyp的源码简单解析(以安装sqlite3为例) date: 2020-11-27 tags: node native sqlite3 前言 简单来 ...

  2. Python之路第一课Day5--随堂笔记(模块)

    本节课程大纲: 1.模块介绍 2.time &datetime模块 3.random 4.os 5.sys 6.shutil 7.json & picle 8.shelve 9.xml ...

  3. Android studio 中的配置编译错误总结

    1.编译Andorid 工程的时候,有时候出现gradle 报下面的错误. Error:(1, 0) Cause: com/android/build/gradle/LibraryPlugin : U ...

  4. Thinkphp源码分析系列(四)–Dispatcher类

    下面我们来分析一下Thinkphp中的url解析和路由调度类.此类主要功能是 // +--------------------------------------------------------- ...

  5. 分享一例测试环境下nginx+tomcat的视频业务部署记录

    需求说明:在测试环境下(192.168.1.28)部署一套公司某业务环境,其中:该业务前台访问地址: http://testhehe.wangshibo.com该业务后台访问地址: http://te ...

  6. python 动态调用模块、类、方法(django项目)

    需求:近一段时间基于django框架,开发各业务层监控代码,每个业务的监控逻辑不同,因此需要开发监控子模块,动态的导入调用. 项目名称:demo_django App:common_base.moni ...

  7. Linux 2.6内核Makefile浅析

    1 概述 Makefile由五个部分组成: Makefile:根目录Makefile,它读取.config文件,并负责创建vmlinux(内核镜像)和modules(模块文件). .config:内核 ...

  8. 用C++为nodejs 写组件,提高node处理效率

    昨天研究了下如何用C++和node交互,在node的程序中,如果有大数据量的计算,处理起来比较慢,可以用C++来处理,然后通过回调(callback的形式),返回给node. 首先,先来看看node ...

  9. Linux Communication Mechanism Summarize

    目录 . Linux通信机制分类简介 . 控制机制 0x1: 竞态条件 0x2: 临界区 . Inter-Process Communication (IPC) mechanisms: 进程间通信机制 ...

  10. C++调用python

    本文以实例code讲解 C++ 调用 python 的方法. 本文在util.h中实现三个函数: 1. init_log: 用google log(glog)初始化log 2. exe_command ...

随机推荐

  1. Pycharm远程连接到服务器运行错误can‘t open file ‘tmp

    Pycharm远程连接到服务器运行错误can't open file '/tmp/.../a.py': [Errno 2] No such file or directory 问题描述 win11 P ...

  2. iperf 工具使用总结

    转载请注明出处: iperf是一个用于测量网络带宽的工具,可以通过客户端和服务器之间的数据传输来评估网络性能.下面详细介绍iperf的使用方法.常用命令和参数以及注意事项,并提供一些示例说明.在ipe ...

  3. 02-Shell变量

    1.Shell变量 1.1 Shell变量的介绍 变量用于存储管理临时的数据, 这些数据都是在运行内存中的. 1.2 变量类型 系统环境变量 自定义变量 特殊符号变量 2.系统环境变量 2.1 介绍 ...

  4. OpenSSL 生成 RootCA (根证书)并自签署证书(支持 IP 地址)

    背景 某机房内部访问需要配置 HTTPS,网上找的一些证书教程都不是特别好,有些直接生成证书,没有根 CA 的证书导致信任不了 Ubuntu 机器,有些教程只有域名生成,没有 IP 生成,有些甚至报错 ...

  5. 01-linux - kvm

    配置linux kvm 逻辑卷 # df -h # fdisk -l | grep dev # pvs # pvcreate /dev/sdg # pvs # vgcreate oradata /de ...

  6. SQL还是NoSQL?架构师必备选型技能

    很多时候我们都会有这样的疑问. 如果这时候直接去看MySQL.Mongo.HBase.Redis等数据库的用法.特点.区别,其实有点太着急了. 这时候,最好从「数据模型」开始讨论. 1.SQL vs ...

  7. Maven 项目工程

    maven打包java --jar1.安装jdk2.安装maven   --安装非常简单 网上教程很多,此步骤忽略-- 3.配置jdk/maven环境变量 # java_jdk export JAVA ...

  8. 银河麒麟V10 SP1忘记账户密码后重置/更改账户密码

    开机进入选择界面,按下键盘E键 光标通过键盘上下左右键移到linux行最后一句(此处是seurity=kysec后) 输入空格 console=tty1 single 按下F10键,等待重启 输入pa ...

  9. CF1295D Same GCDs

    前置知识: 辗转相除法 欧拉函数 首先,根据辗转相除法求 \(\gcd\) 的公式,可得 \(\gcd(a+x,m)=\gcd((a+x)\mod m,m)\). 则题目可以转化为:求有多少 \(x\ ...

  10. 采药(lgP1048)

    emmm 01 背包模板... 设 f[i] 表示背包容积为 i 时所得的最大价值. 则状态转移方程为 f[j] = f[j - w[i]] + c[i] . #include<bits/std ...