日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

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

發(fā)布時(shí)間:2023/12/31 windows 17 coder
生活随笔 收集整理的這篇文章主要介紹了 --{module_name}_binary_host_mirror和--{module_name}_binary_site 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

--{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全稱(chēng)Generate Your Projects(構(gòu)建你的項(xiàng)目)

node-gyp

抹平了不同平臺(tái)之間的差異(比如mac和windows),將源代碼編譯為可執(zhí)行的二進(jìn)制文件。由于某些npm包底層是使用C++/C這種依賴(lài)平臺(tái)的代碼,比如node-sass。所以就不能直接像其他普通包一樣從npm中直接下載文件到本地,而是需要將源代碼拉下來(lái)使用node-gyp將源代碼編譯為可執(zhí)行的二進(jìn)制文件。

node-pre-gyp

每次安裝包都需要使用node-gyp本地構(gòu)建,這樣很麻煩。庫(kù)開(kāi)發(fā)者將編譯好的各種平臺(tái)的二進(jìn)制包發(fā)布到node-pre-gyp中,用戶(hù)進(jìn)行install時(shí)會(huì)首先根據(jù)本地的環(huán)境看遠(yuǎn)端是否有編譯好的二進(jìn)制文件,如果有就直接使用編譯好的二進(jìn)制文件。如果沒(méi)有則本地使用node-gyp編譯生成本地的可執(zhí)行二進(jìn)制文件。

如何指定二進(jìn)制包的位置

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

binary: {
  ...
}

指定的位置網(wǎng)絡(luò)被墻,比如github。使用--{module_name}_binary_host_mirror

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

什么時(shí)候使用--{module_name}_binary_host_mirror

使用node-pre-gyp包的就需要使用binary_host_mirror,因?yàn)閚ode-pre-gyp內(nèi)部在install時(shí)會(huì)優(yōu)先讀取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",
      //...
    },
}

執(zhí)行npm i sqlite3時(shí)會(huì)首先從npm中下載sqlite3的源代碼,下載完后檢測(cè)到源碼的package.json中的script標(biāo)簽中有install指令,就會(huì)執(zhí)行install,執(zhí)行node-pre-gyp install --fallback-to-buildnode-pre-gypnode_modules/.bin/node-pre-gyp中,執(zhí)行node-pre-gyplib/main.js文件。

這里的install命令在js中可以使用process.argv[2]process.argv[3]分別讀取到install--fallback-to-buildprocess.argv[0]的值為nodejs可執(zhí)行文件所在的位置,process.argv[1]的值為當(dāng)前執(zhí)行的 JavaScript 文件所在的路徑。從2開(kāi)始都是命令行參數(shù)了。

node-pre-gyp中下載預(yù)編譯二進(jìn)制文件的代碼

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;

可以通過(guò)process.env讀取npm的config,比如讀取registryprocess.env.npm_config_registry

所以這里的host優(yōu)先從npm config里面去讀binary_host_mirror,其中的module_name的值為包的package.json文件中的"binary.module_name"字段。

什么時(shí)候使用--{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時(shí)會(huì)先從npm中下載node-sass的源碼。源碼下載完成后檢測(cè)到script中有install命令,如何執(zhí)行install命令。

scripts/install.js文件

function checkAndDownloadBinary() {
  var cachedBinary = sass.getCachedBinary(),
      cachePath = sass.getBinaryCachePath(),
      binaryPath = sass.getBinaryPath();
  // 下載二進(jìn)制可執(zhí)行文件    
  download(sass.getBinaryUrl(), binaryPath, function(err) {
    // ....
  });
}

// If binary does not exist, download it
checkAndDownloadBinary();

調(diào)用checkAndDownloadBinary方法進(jìn)行下載預(yù)編譯文件。

getBinaryUrlgetArgument函數(shù):

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('/');
}

下載預(yù)編譯文件時(shí)優(yōu)先使用在命令行中指定的--sass-binary-site。比如:npm install node-sass --sass-binary-site=https://npmmirror.com/mirrors/node-sass/

其次使用環(huán)境變量中指定的SASS_BINARY_SITE。比如:export SASS_BINARY_SITE=http://example.com/

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

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

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

最后就是一個(gè)寫(xiě)死的github地址'https://github.com/sass/node-sass/releases/download'

總結(jié):

要安裝的包如果使用了node-pre-gyp(比如nodejieba),在.npmrc文件中配置國(guó)內(nèi)預(yù)編譯文件鏡像URL就需要使用--{module_name}_binary_host_mirror。其中的module_name的值為包的package.json中配置的"binary.module_name"的值。

什么時(shí)候使用--{module_name}_binary_site實(shí)際是由要安裝的包內(nèi)部自己實(shí)現(xiàn)的,典型的案例就是node-sass

總結(jié)

以上是生活随笔為你收集整理的--{module_name}_binary_host_mirror和--{module_name}_binary_site的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。