1
0
mirror of https://github.com/citizenfx/cfx-server-data.git synced 2025-01-12 01:03:14 +08:00
cfx-server-data/resources/[system]/[builders]/yarn/yarn_builder.js

81 lines
2.0 KiB
JavaScript
Raw Normal View History

2018-04-25 03:40:18 +08:00
const path = require('path');
const fs = require('fs');
const child_process = require('child_process');
let buildingInProgress = false;
let currentBuildingModule = '';
2018-04-25 03:40:18 +08:00
const initCwd = process.cwd();
2018-04-25 03:40:18 +08:00
const yarnBuildTask = {
shouldBuild(resourceName) {
try {
const resourcePath = GetResourcePath(resourceName);
const packageJson = path.resolve(resourcePath, 'package.json');
const yarnLock = path.resolve(resourcePath, 'yarn.lock');
const packageStat = fs.statSync(packageJson);
try {
const yarnStat = fs.statSync(yarnLock);
2018-10-03 22:55:18 +08:00
2018-04-25 03:40:18 +08:00
if (packageStat.mtimeMs > yarnStat.mtimeMs) {
return true;
}
} catch (e) {
// no yarn.lock, but package.json - install time!
return true;
}
} catch (e) {
}
return false;
},
build(resourceName, cb) {
(async () => {
while (buildingInProgress && currentBuildingModule !== resourceName) {
console.log(`yarn is currently busy: we are waiting to compile ${resourceName}`);
await sleep(3000);
}
buildingInProgress = true;
currentBuildingModule = resourceName;
const process = child_process.fork(
require.resolve('./yarn_cli.js'),
['install', '--ignore-scripts', '--cache-folder', path.join(initCwd, 'cache', 'yarn-cache'), '--mutex', 'file:' + path.join(initCwd, 'cache', 'yarn-mutex')],
{
cwd: path.resolve(GetResourcePath(resourceName))
});
process.on('exit', (code, signal) => {
setImmediate(() => {
if (code != 0 || signal) {
buildingInProgress = false;
currentBuildingModule = '';
cb(false, 'yarn failed!');
return;
}
const resourcePath = GetResourcePath(resourceName);
const yarnLock = path.resolve(resourcePath, 'yarn.lock');
try {
fs.utimesSync(yarnLock, new Date(), new Date());
} catch (e) {
}
buildingInProgress = false;
currentBuildingModule = '';
cb(true);
});
2018-04-25 03:40:18 +08:00
});
})();
2018-04-25 03:40:18 +08:00
}
};
2018-04-25 03:40:18 +08:00
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
RegisterResourceBuildTaskFactory('yarn', () => yarnBuildTask);