From 4d75ee30d4ef04b2423abf177e2b00a108a3eb54 Mon Sep 17 00:00:00 2001 From: fengmk2 Date: Wed, 9 Mar 2016 01:21:01 +0800 Subject: [PATCH 1/2] feat: Auto set China mirror for prebuild binary packages closes #45 --- bin/install.js | 5 ++++ lib/download/npm.js | 19 +++++++++++-- lib/local_install.js | 2 ++ lib/prebuild_mirror_config_china.json | 41 +++++++++++++++++++++++++++ 4 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 lib/prebuild_mirror_config_china.json diff --git a/bin/install.js b/bin/install.js index 0a4c297b..5e2f0ead 100755 --- a/bin/install.js +++ b/bin/install.js @@ -122,10 +122,14 @@ const env = { npm_config_registry: registry, }; +let binaryMirrors = {}; + if (inChina) { for (const key in config.chineseMirrorEnv) { env[key] = config.chineseMirrorEnv[key]; } + + binaryMirrors = require('../lib/prebuild_mirror_config_china.json'); } // npm cli will auto set options to npm_xx env. @@ -146,6 +150,7 @@ co(function*() { production, cacheDir, env, + binaryMirrors, }; config.strictSSL = getStrictSSL(); // -g install to npm's global prefix diff --git a/lib/download/npm.js b/lib/download/npm.js index d25bb002..e83b7a6f 100644 --- a/lib/download/npm.js +++ b/lib/download/npm.js @@ -94,10 +94,25 @@ function* download(pkg, options) { yield checkShasumAndUngzip(ungzipDir, stream, pkg); yield fs.writeFile(donefile, Date()); - yield utils.addMetaToJSONFile(path.join(ungzipDir, 'package.json'), { + const pkgMeta = { _from: `${pkg.name}@${pkg.version}`, _resolved: pkg.dist.tarball, - }); + }; + const binaryMirror = options.binaryMirrors[pkg.name]; + if (binaryMirror && pkg.scripts && pkg.scripts.install) { + // leveldown and sqlite3 + if (/prebuild \-\-install/.test(pkg.scripts.install) || + /prebuild \-\-download/.test(pkg.scripts.install) || + /node\-pre\-gyp install/.test(pkg.scripts.install)) { + const newBinary = pkg.binary || {}; + for (const key in binaryMirror) { + newBinary[key] = binaryMirror[key]; + } + pkgMeta.binary = newBinary; + options.console.info(`[${pkg.name}@${pkg.version}] download from binary mirror: %j`, newBinary); + } + } + yield utils.addMetaToJSONFile(path.join(ungzipDir, 'package.json'), pkgMeta); options.cache[key].done = true; options.events.emit(key); diff --git a/lib/local_install.js b/lib/local_install.js index e23d38eb..33e9c643 100644 --- a/lib/local_install.js +++ b/lib/local_install.js @@ -46,6 +46,7 @@ const dependencies = require('./dependencies'); * - {Object} [env] - postinstall and preinstall scripts custom env. * - {String} [cacheDir] - tarball cache store dir, default is `$HOME/.npminstall_tarball`. * if `production` mode enable, `cacheDir` will be disable. + * - {Object} [binaryMirrors] - binary mirror config, default is `{}` */ module.exports = function*(options) { options.events = new EventEmitter(); @@ -84,6 +85,7 @@ module.exports = function*(options) { options.remotePackages = 0; options.registryPackages = 0; options.gitPackages = 0; + options.binaryMirrors = {}; if (options.production) { options.cacheDir = ''; } else { diff --git a/lib/prebuild_mirror_config_china.json b/lib/prebuild_mirror_config_china.json new file mode 100644 index 00000000..daa22bc4 --- /dev/null +++ b/lib/prebuild_mirror_config_china.json @@ -0,0 +1,41 @@ +{ + "leveldown": { + "host": "https://npm.taobao.org/mirrors/leveldown/v{version}" + }, + "leveldown-hyper": { + "host": "https://npm.taobao.org/mirrors/leveldown-hyper/v{version}" + }, + "mknod": { + "host": "https://npm.taobao.org/mirrors/mknod/v{version}" + }, + "couchbase": { + "host": "https://npm.taobao.org/mirrors/couchbase/v{version}" + }, + "sodium-prebuilt": { + "host": "https://npm.taobao.org/mirrors/sodium-prebuilt/v{version}" + }, + "utp-native": { + "host": "https://npm.taobao.org/mirrors/utp-native/v{version}" + }, + "node-tk5": { + "host": "https://npm.taobao.org/mirrors/node-tk5/v{version}" + }, + "fuse-bindings": { + "host": "https://npm.taobao.org/mirrors/fuse-bindings/v{version}" + }, + "zmq-prebuilt": { + "host": "https://npm.taobao.org/mirrors/zmq-prebuilt/v{version}" + }, + "gl": { + "host": "https://npm.taobao.org/mirrors/gl/v{version}" + }, + "hackrf": { + "host": "https://npm.taobao.org/mirrors/hackrf/v{version}" + }, + "rabin": { + "host": "https://npm.taobao.org/mirrors/rabin/v{version}" + }, + "sqlite3": { + "host": "https://npm.taobao.org/mirrors" + } +} From fe0fb6b0d58eb99bd0f7b2cdc2ae8ae1dff3e4c5 Mon Sep 17 00:00:00 2001 From: fengmk2 Date: Wed, 9 Mar 2016 11:45:19 +0800 Subject: [PATCH 2/2] refactor: Get mirrors from https://github.com/cnpm/binary-mirror-config/blob/master/package.json#L43 --- bin/install.js | 20 ++++++++++--- lib/get.js | 4 ++- lib/local_install.js | 2 +- lib/prebuild_mirror_config_china.json | 41 --------------------------- 4 files changed, 20 insertions(+), 47 deletions(-) delete mode 100644 lib/prebuild_mirror_config_china.json diff --git a/bin/install.js b/bin/install.js index 5e2f0ead..a93c5b2f 100755 --- a/bin/install.js +++ b/bin/install.js @@ -25,6 +25,7 @@ const fs = require('mz/fs'); const parseArgs = require('minimist'); const utils = require('../lib/utils'); const config = require('../lib/config'); +const get = require('../lib/get'); const installLocal = require('..').installLocal; const installGlobal = require('..').installGlobal; @@ -122,14 +123,10 @@ const env = { npm_config_registry: registry, }; -let binaryMirrors = {}; - if (inChina) { for (const key in config.chineseMirrorEnv) { env[key] = config.chineseMirrorEnv[key]; } - - binaryMirrors = require('../lib/prebuild_mirror_config_china.json'); } // npm cli will auto set options to npm_xx env. @@ -143,6 +140,21 @@ for (const key in argv) { debug('argv: %j, env: %j', argv, env); co(function*() { + let binaryMirrors = {}; + + if (inChina) { + const binaryMirrorUrl = registry + '/binary-mirror-config/latest'; + try { + const res = yield get(binaryMirrorUrl, { + dataType: 'json', + followRedirect: true, + }); + binaryMirrors = res.data.mirrors.china; + } catch (err) { + debug('Get %s error: %s', binaryMirrorUrl, err); + } + } + const config = { root, registry, diff --git a/lib/get.js b/lib/get.js index 27341420..8fb0710b 100644 --- a/lib/get.js +++ b/lib/get.js @@ -36,7 +36,9 @@ function* get(url, options, globalOptions) { options.agent = httpKeepaliveAgent; options.headers = options.headers || {}; options.headers['User-Agent'] = USER_AGENT; - options.rejectUnauthorized = globalOptions.strictSSL; + if (globalOptions) { + options.rejectUnauthorized = globalOptions.strictSSL; + } const result = yield _get(url, options, 5); debug('GET %s, headers: %j from %j', result.status, result.headers, url); if (result.status < 100 || result.status >= 300) { diff --git a/lib/local_install.js b/lib/local_install.js index 33e9c643..77be78b3 100644 --- a/lib/local_install.js +++ b/lib/local_install.js @@ -85,7 +85,7 @@ module.exports = function*(options) { options.remotePackages = 0; options.registryPackages = 0; options.gitPackages = 0; - options.binaryMirrors = {}; + options.binaryMirrors = options.binaryMirrors || {}; if (options.production) { options.cacheDir = ''; } else { diff --git a/lib/prebuild_mirror_config_china.json b/lib/prebuild_mirror_config_china.json deleted file mode 100644 index daa22bc4..00000000 --- a/lib/prebuild_mirror_config_china.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "leveldown": { - "host": "https://npm.taobao.org/mirrors/leveldown/v{version}" - }, - "leveldown-hyper": { - "host": "https://npm.taobao.org/mirrors/leveldown-hyper/v{version}" - }, - "mknod": { - "host": "https://npm.taobao.org/mirrors/mknod/v{version}" - }, - "couchbase": { - "host": "https://npm.taobao.org/mirrors/couchbase/v{version}" - }, - "sodium-prebuilt": { - "host": "https://npm.taobao.org/mirrors/sodium-prebuilt/v{version}" - }, - "utp-native": { - "host": "https://npm.taobao.org/mirrors/utp-native/v{version}" - }, - "node-tk5": { - "host": "https://npm.taobao.org/mirrors/node-tk5/v{version}" - }, - "fuse-bindings": { - "host": "https://npm.taobao.org/mirrors/fuse-bindings/v{version}" - }, - "zmq-prebuilt": { - "host": "https://npm.taobao.org/mirrors/zmq-prebuilt/v{version}" - }, - "gl": { - "host": "https://npm.taobao.org/mirrors/gl/v{version}" - }, - "hackrf": { - "host": "https://npm.taobao.org/mirrors/hackrf/v{version}" - }, - "rabin": { - "host": "https://npm.taobao.org/mirrors/rabin/v{version}" - }, - "sqlite3": { - "host": "https://npm.taobao.org/mirrors" - } -}