You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.7 KiB
JavaScript
58 lines
1.7 KiB
JavaScript
7 months ago
|
var spawn = require('child_process').spawn;
|
||
|
var path = require('path');
|
||
|
var fs = require('fs');
|
||
|
|
||
|
function installArchSpecificPackage(version, require) {
|
||
|
|
||
|
process.env.npm_config_global = 'false';
|
||
|
|
||
|
var platform = process.platform == 'win32' ? 'win' : process.platform;
|
||
|
var arch = platform == 'win' && process.arch == 'ia32' ? 'x86' : process.arch;
|
||
|
var prefix = (process.platform == 'darwin' && process.arch == 'arm64') ? 'node-bin' : 'node';
|
||
|
|
||
|
var cp = spawn(platform == 'win' ? 'npm.cmd' : 'npm', ['install', '--no-save', [prefix, platform, arch].join('-') + '@' + version], {
|
||
|
stdio: 'inherit',
|
||
|
shell: true
|
||
|
});
|
||
|
|
||
|
cp.on('close', function(code) {
|
||
|
var pkgJson = require.resolve([prefix, platform, arch].join('-') + '/package.json');
|
||
|
var subpkg = JSON.parse(fs.readFileSync(pkgJson, 'utf8'));
|
||
|
var executable = subpkg.bin.node;
|
||
|
var bin = path.resolve(path.dirname(pkgJson), executable);
|
||
|
|
||
|
try {
|
||
|
fs.mkdirSync(path.resolve(process.cwd(), 'bin'));
|
||
|
} catch (e) {
|
||
|
if (e.code != 'EEXIST') {
|
||
|
throw e;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
linkSync(bin, path.resolve(process.cwd(), executable));
|
||
|
|
||
|
if (platform == 'win') {
|
||
|
var pkg = JSON.parse(fs.readFileSync(path.resolve(process.cwd(), 'package.json')));
|
||
|
fs.writeFileSync(path.resolve(process.cwd(), 'bin/node'), 'This file intentionally left blank');
|
||
|
pkg.bin.node = 'bin/node.exe';
|
||
|
fs.writeFileSync(path.resolve(process.cwd(), 'package.json'), JSON.stringify(pkg, null, 2));
|
||
|
}
|
||
|
|
||
|
return process.exit(code);
|
||
|
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function linkSync(src, dest) {
|
||
|
try {
|
||
|
fs.unlinkSync(dest);
|
||
|
} catch (e) {
|
||
|
if (e.code != 'ENOENT') {
|
||
|
throw e;
|
||
|
}
|
||
|
}
|
||
|
return fs.linkSync(src, dest);
|
||
|
}
|
||
|
|
||
|
module.exports = installArchSpecificPackage;
|