74 lines
2.3 KiB
JavaScript
74 lines
2.3 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
module.exports = exports = _package;
|
||
|
|
||
|
exports.usage = 'Packs binary (and enclosing directory) into locally staged tarball';
|
||
|
|
||
|
const fs = require('fs');
|
||
|
const path = require('path');
|
||
|
const log = require('npmlog');
|
||
|
const versioning = require('./util/versioning.js');
|
||
|
const napi = require('./util/napi.js');
|
||
|
const existsAsync = fs.exists || path.exists;
|
||
|
const makeDir = require('make-dir');
|
||
|
const tar = require('tar');
|
||
|
|
||
|
function readdirSync(dir) {
|
||
|
let list = [];
|
||
|
const files = fs.readdirSync(dir);
|
||
|
|
||
|
files.forEach((file) => {
|
||
|
const stats = fs.lstatSync(path.join(dir, file));
|
||
|
if (stats.isDirectory()) {
|
||
|
list = list.concat(readdirSync(path.join(dir, file)));
|
||
|
} else {
|
||
|
list.push(path.join(dir, file));
|
||
|
}
|
||
|
});
|
||
|
return list;
|
||
|
}
|
||
|
|
||
|
function _package(gyp, argv, callback) {
|
||
|
const package_json = gyp.package_json;
|
||
|
const napi_build_version = napi.get_napi_build_version_from_command_args(argv);
|
||
|
const opts = versioning.evaluate(package_json, gyp.opts, napi_build_version);
|
||
|
const from = opts.module_path;
|
||
|
const binary_module = path.join(from, opts.module_name + '.node');
|
||
|
existsAsync(binary_module, (found) => {
|
||
|
if (!found) {
|
||
|
return callback(new Error('Cannot package because ' + binary_module + ' missing: run `node-pre-gyp rebuild` first'));
|
||
|
}
|
||
|
const tarball = opts.staged_tarball;
|
||
|
const filter_func = function(entry) {
|
||
|
const basename = path.basename(entry);
|
||
|
if (basename.length && basename[0] !== '.') {
|
||
|
console.log('packing ' + entry);
|
||
|
return true;
|
||
|
} else {
|
||
|
console.log('skipping ' + entry);
|
||
|
}
|
||
|
return false;
|
||
|
};
|
||
|
makeDir(path.dirname(tarball)).then(() => {
|
||
|
let files = readdirSync(from);
|
||
|
const base = path.basename(from);
|
||
|
files = files.map((file) => {
|
||
|
return path.join(base, path.relative(from, file));
|
||
|
});
|
||
|
tar.create({
|
||
|
portable: false,
|
||
|
gzip: true,
|
||
|
filter: filter_func,
|
||
|
file: tarball,
|
||
|
cwd: path.dirname(from)
|
||
|
}, files, (err2) => {
|
||
|
if (err2) console.error('[' + package_json.name + '] ' + err2.message);
|
||
|
else log.info('package', 'Binary staged at "' + tarball + '"');
|
||
|
return callback(err2);
|
||
|
});
|
||
|
}).catch((err) => {
|
||
|
return callback(err);
|
||
|
});
|
||
|
});
|
||
|
}
|