[build/downloadNode] async/await

This commit is contained in:
spalger 2015-08-13 15:43:58 -07:00
parent fb560cf796
commit ee83c4103c
3 changed files with 87 additions and 67 deletions

View file

@ -26,8 +26,13 @@ module.exports = function (grunt) {
}
}()),
nodeVersion: '0.10.35',
platforms: ['darwin-x64', 'linux-x64', 'linux-x86', 'windows'],
nodeVersion: '2.5.0',
platforms: [
'darwin-x64',
'linux-x64',
'linux-x86',
'windows'
],
services: [
['launchd', '10.9'],
['upstart', '1.5'],

80
tasks/downloadNodeBins.js Normal file
View file

@ -0,0 +1,80 @@
module.exports = function (grunt) {
grunt.registerTask('downloadNodeBins', function () {
let { map, fromNode, promisify } = require('bluebird');
let { resolve } = require('path');
let { createWriteStream } = require('fs');
let { createGunzip } = require('zlib');
let { Extract } = require('tar');
let mkdirp = promisify(require('mkdirp'));
let rename = promisify(require('fs').rename);
let get = (uri) => fromNode(cb => require('wreck').request('GET', uri, null, cb));
let exists = (path) => fromNode(cb => {
require('fs').stat(path, err => cb(null, !err));
});
let platforms = grunt.config.get('platforms');
let nodeVersion = grunt.config.get('nodeVersion');
let nodeDir = require('requirefrom')('src/utils')('fromRoot')(`.node_binaries/${nodeVersion}`);
let baseUri = `https://iojs.org/dist/v${nodeVersion}`;
let writeTar = async (to, from) => {
await fromNode(cb => {
from
.pipe(createGunzip())
.on('error', cb)
.pipe(new Extract({ path: to, strip: 1 }))
.on('error', cb)
.on('end', cb);
});
};
let writeExe = async (to, from) => {
let winBinDir = resolve(to, 'bin');
await mkdirp(winBinDir);
await fromNode(cb => {
from
.pipe(createWriteStream(resolve(winBinDir, 'node.exe')))
.on('error', cb)
.on('finish', cb);
});
};
mkdirp(nodeDir)
.then(function () {
grunt.log.ok(`downloading node binaries for ${platforms.join(', ')}`);
return platforms;
})
.map(async function (platform) {
let finalDir = resolve(nodeDir, `${platform}`);
let downloadDir = `${finalDir}.temp`;
if (await exists(finalDir)) {
grunt.log.ok(`${platform} download exists`);
return;
}
let uri;
if (platform === 'windows') {
uri = `${baseUri}/win-x64/iojs.exe`;
} else {
uri = `${baseUri}/iojs-v${nodeVersion}-${platform}.tar.gz`;
}
let resp = await get('GET', uri);
if (resp.statusCode !== 200) {
throw new Error(uri + ' failed with a ' + resp.statusCode);
}
let write = platform === 'windows' ? writeExe : writeTar;
await write(downloadDir, resp);
await rename(downloadDir, finalDir);
grunt.log.ok(`${platform} download complete`);
})
.nodeify(this.async());
});
};

View file

@ -1,65 +0,0 @@
var _ = require('lodash');
var zlib = require('zlib');
var tar = require('tar');
var request = require('request');
var mkdirp = require('mkdirp');
var fs = require('fs');
var { join } = require('path');
var filesPatern = _.template('node-v<%- version %>-<%- platform %>.tar.gz');
var urlPattern = _.template('http://nodejs.org/dist/v<%- version %>/<%- file %>');
var Promise = require('bluebird');
module.exports = function (grunt) {
grunt.registerTask('download_node_binaries', 'Download the node.js binaries', function () {
var platforms = _.without(grunt.config.get('platforms'), 'windows');
var rootPath = grunt.config.get('root');
var version = grunt.config.get('nodeVersion');
var handle404 = function (response) {
if (response.statusCode !== 200) {
throw new Error(response.request.href + ' failed with a ' + response.statusCode);
}
};
var downloadWindows = function (cb) {
return new Promise(function (resolve, reject) {
var dest = join(rootPath, '.node_binaries', 'windows');
fs.stat(dest, function (err) {
if (!err) return resolve(); // skip downloading if we already have them
var url = urlPattern({ version: version, file: 'node.exe'});
mkdirp(dest, function (err) {
if (err) return reject(err);
var out = fs.createWriteStream(join(dest, 'node.exe'));
out.on('close', resolve).on('error', reject);
var req = request.get(url);
req.on('response', handle404);
req.pipe(out);
});
});
});
};
var download = function (platform) {
return new Promise(function (resolve, reject) {
var dest = join(rootPath, '.node_binaries', platform);
fs.stat(dest, function (err) {
if (!err) return resolve(); // skip downloading if we already have them
var file = filesPatern({ version: version, platform: platform });
var url = urlPattern({ version: version, file: file });
mkdirp(dest, function (err) {
if (err) return reject(err);
var unzip = zlib.createGunzip();
var out = new tar.Extract({ path: dest, strip: 1 });
out.on('close', resolve).on('error', reject);
var req = request.get(url);
req.on('response', handle404);
req.pipe(unzip).pipe(out);
});
});
});
};
return Promise.map(platforms, download).then(downloadWindows).nodeify(this.async());
});
};