--{module_name}_binary_host_mirror和--{module_name}_binary_site
--{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舉例:
sqlite3的package.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-build。node-pre-gyp在node_modules/.bin/node-pre-gyp中,執行node-pre-gyp的lib/main.js文件。
這里的install命令在js中可以使用process.argv[2]和process.argv[3]分別讀取到install和--fallback-to-build。process.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,比如讀取registry:process.env.npm_config_registry
所以這里的host優先從npm config里面去讀binary_host_mirror,其中的module_name的值為包的package.json文件中的"binary.module_name"字段。
什么時候使用--{module_name}_binary_site
node-sass的package.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方法進行下載預編譯文件。
getBinaryUrl和getArgument函數:
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 『UniApp』uni-app-打包成A
- 下一篇: 2023年总结:不上班的这半年!