mirror of
https://github.com/citizenfx/cfx-server-data.git
synced 2025-01-08 06:02:57 +08:00
Compare commits
3 Commits
bbc77613f0
...
60da977c02
Author | SHA1 | Date | |
---|---|---|---|
|
60da977c02 | ||
|
3bac230553 | ||
|
85419a6145 |
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "webpack-builder",
|
"name": "webpack-builder",
|
||||||
"version": "1.0.0",
|
"version": "1.0.1",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@ -9,8 +9,8 @@
|
|||||||
"author": "",
|
"author": "",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"async": "^2.6.1",
|
"async": "^3.1.0",
|
||||||
"webpack": "^4.12.0",
|
"webpack": "^4.41.2",
|
||||||
"worker-farm": "^1.6.0"
|
"worker-farm": "^1.7.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,138 +2,155 @@ const fs = require('fs');
|
|||||||
const path = require('path');
|
const path = require('path');
|
||||||
const workerFarm = require('worker-farm');
|
const workerFarm = require('worker-farm');
|
||||||
const async = require('async');
|
const async = require('async');
|
||||||
|
let buildingInProgress = false;
|
||||||
|
let currentBuildingModule = '';
|
||||||
|
let currentBuildingScript = '';
|
||||||
const webpackBuildTask = {
|
const webpackBuildTask = {
|
||||||
shouldBuild(resourceName) {
|
shouldBuild(resourceName) {
|
||||||
const numMetaData = GetNumResourceMetadata(resourceName, 'webpack_config');
|
const numMetaData = GetNumResourceMetadata(resourceName, 'webpack_config');
|
||||||
|
|
||||||
if (numMetaData > 0) {
|
|
||||||
for (let i = 0; i < numMetaData; i++) {
|
|
||||||
const configName = GetResourceMetadata(resourceName, 'webpack_config');
|
|
||||||
|
|
||||||
if (shouldBuild(configName)) {
|
if (numMetaData > 0) {
|
||||||
return true;
|
for (let i = 0; i < numMetaData; i++) {
|
||||||
}
|
const configName = GetResourceMetadata(resourceName, 'webpack_config');
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
|
|
||||||
function loadCache(config) {
|
if (shouldBuild(configName)) {
|
||||||
const cachePath = `cache/${resourceName}/${config.replace(/\//g, '_')}.json`;
|
return true;
|
||||||
|
}
|
||||||
try {
|
}
|
||||||
return JSON.parse(fs.readFileSync(cachePath, { encoding: 'utf8' }));
|
}
|
||||||
} catch {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function shouldBuild(config) {
|
|
||||||
const cache = loadCache(config);
|
|
||||||
|
|
||||||
if (!cache) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const file of cache) {
|
|
||||||
const stats = getStat(file.name);
|
|
||||||
|
|
||||||
if (!stats ||
|
|
||||||
stats.mtime !== file.stats.mtime ||
|
|
||||||
stats.size !== file.stats.size ||
|
|
||||||
stats.inode !== file.stats.inode) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getStat(path) {
|
|
||||||
try {
|
|
||||||
const stat = fs.statSync(path);
|
|
||||||
|
|
||||||
return stat ? {
|
|
||||||
mtime: stat.mtimeMs,
|
|
||||||
size: stat.size,
|
|
||||||
inode: stat.ino,
|
|
||||||
} : null;
|
|
||||||
} catch {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
build(resourceName, cb) {
|
|
||||||
const configs = [];
|
|
||||||
const numMetaData = GetNumResourceMetadata(resourceName, 'webpack_config');
|
|
||||||
|
|
||||||
for (let i = 0; i < numMetaData; i++) {
|
|
||||||
configs.push(GetResourceMetadata(resourceName, 'webpack_config', i));
|
|
||||||
}
|
|
||||||
|
|
||||||
async.forEachOf(configs, (configName, i, acb) => {
|
|
||||||
const configPath = GetResourcePath(resourceName) + '/' + configName;
|
|
||||||
|
|
||||||
const cachePath = `cache/${resourceName}/${configName.replace(/\//g, '_')}.json`;
|
return false;
|
||||||
|
|
||||||
try {
|
function loadCache(config) {
|
||||||
fs.mkdirSync(path.dirname(cachePath));
|
const cachePath = `cache/${resourceName}/${config.replace(/\//g, '_')}.json`;
|
||||||
} catch {}
|
|
||||||
|
|
||||||
const config = require(configPath);
|
|
||||||
|
|
||||||
const workers = workerFarm(require.resolve('./webpack_runner'));
|
|
||||||
|
|
||||||
if (config) {
|
|
||||||
const resourcePath = path.resolve(GetResourcePath(resourceName));
|
|
||||||
|
|
||||||
workers({
|
|
||||||
configPath,
|
|
||||||
resourcePath,
|
|
||||||
cachePath
|
|
||||||
}, (err, outp) => {
|
|
||||||
workerFarm.end(workers);
|
|
||||||
|
|
||||||
if (err) {
|
|
||||||
console.error(err.stack || err);
|
|
||||||
if (err.details) {
|
|
||||||
console.error(err.details);
|
|
||||||
}
|
|
||||||
|
|
||||||
acb("worker farm webpack errored out");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (outp.errors) {
|
|
||||||
for (const error of outp.errors) {
|
|
||||||
console.log(error);
|
|
||||||
}
|
|
||||||
acb("webpack got an error");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log(`${resourceName}: built ${configName}`);
|
try {
|
||||||
|
return JSON.parse(fs.readFileSync(cachePath, {encoding: 'utf8'}));
|
||||||
acb();
|
} catch {
|
||||||
});
|
return null;
|
||||||
|
}
|
||||||
return;
|
}
|
||||||
}
|
|
||||||
|
function shouldBuild(config) {
|
||||||
acb("no configuration");
|
const cache = loadCache(config);
|
||||||
}, (err) => {
|
|
||||||
setImmediate(() => {
|
if (!cache) {
|
||||||
if (err) {
|
return true;
|
||||||
cb(false, err);
|
}
|
||||||
return;
|
|
||||||
}
|
for (const file of cache) {
|
||||||
|
const stats = getStat(file.name);
|
||||||
cb(true);
|
|
||||||
});
|
if (!stats ||
|
||||||
});
|
stats.mtime !== file.stats.mtime ||
|
||||||
}
|
stats.size !== file.stats.size ||
|
||||||
|
stats.inode !== file.stats.inode) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getStat(path) {
|
||||||
|
try {
|
||||||
|
const stat = fs.statSync(path);
|
||||||
|
|
||||||
|
return stat ? {
|
||||||
|
mtime: stat.mtimeMs,
|
||||||
|
size: stat.size,
|
||||||
|
inode: stat.ino,
|
||||||
|
} : null;
|
||||||
|
} catch {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
build(resourceName, cb) {
|
||||||
|
let buildWebpack = async () => {
|
||||||
|
let error = null;
|
||||||
|
const configs = [];
|
||||||
|
const numMetaData = GetNumResourceMetadata(resourceName, 'webpack_config');
|
||||||
|
|
||||||
|
for (let i = 0; i < numMetaData; i++) {
|
||||||
|
configs.push(GetResourceMetadata(resourceName, 'webpack_config', i));
|
||||||
|
}
|
||||||
|
for (const configName of configs) {
|
||||||
|
const configPath = GetResourcePath(resourceName) + '/' + configName;
|
||||||
|
|
||||||
|
const cachePath = `cache/${resourceName}/${configName.replace(/\//g, '_')}.json`;
|
||||||
|
|
||||||
|
try {
|
||||||
|
fs.mkdirSync(path.dirname(cachePath));
|
||||||
|
} catch {
|
||||||
|
}
|
||||||
|
|
||||||
|
const config = require(configPath);
|
||||||
|
|
||||||
|
const workers = workerFarm(require.resolve('./webpack_runner'));
|
||||||
|
|
||||||
|
if (config) {
|
||||||
|
const resourcePath = path.resolve(GetResourcePath(resourceName));
|
||||||
|
|
||||||
|
while (buildingInProgress) {
|
||||||
|
console.log(`webpack is busy by another process: we are waiting to compile ${resourceName} (${configName})`);
|
||||||
|
await sleep(3000);
|
||||||
|
}
|
||||||
|
buildingInProgress = true;
|
||||||
|
currentBuildingModule = resourceName;
|
||||||
|
currentBuildingScript = configName;
|
||||||
|
workers({
|
||||||
|
configPath,
|
||||||
|
resourcePath,
|
||||||
|
cachePath
|
||||||
|
}, (err, outp) => {
|
||||||
|
workerFarm.end(workers);
|
||||||
|
|
||||||
|
if (err) {
|
||||||
|
console.error(err.stack || err);
|
||||||
|
if (err.details) {
|
||||||
|
console.error(err.details);
|
||||||
|
}
|
||||||
|
|
||||||
|
buildingInProgress = false;
|
||||||
|
currentBuildingModule = '';
|
||||||
|
currentBuildingScript = '';
|
||||||
|
error = "worker farm webpack errored out";
|
||||||
|
console.error("worker farm webpack errored out");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (outp.errors) {
|
||||||
|
for (const error of outp.errors) {
|
||||||
|
console.log(error);
|
||||||
|
}
|
||||||
|
buildingInProgress = false;
|
||||||
|
currentBuildingModule = '';
|
||||||
|
currentBuildingScript = '';
|
||||||
|
error = "webpack got an error";
|
||||||
|
console.error("webpack got an error");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`${resourceName}: built ${configName}`);
|
||||||
|
|
||||||
|
buildingInProgress = false;
|
||||||
|
currentBuildingModule = '';
|
||||||
|
currentBuildingScript = '';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (error) {
|
||||||
|
cb(false, error);
|
||||||
|
} else cb(true);
|
||||||
|
};
|
||||||
|
buildWebpack().then();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function sleep(ms) {
|
||||||
|
return new Promise(resolve => setTimeout(resolve, ms));
|
||||||
}
|
}
|
||||||
|
|
||||||
RegisterResourceBuildTaskFactory('z_webpack', () => webpackBuildTask);
|
RegisterResourceBuildTaskFactory('z_webpack', () => webpackBuildTask);
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
const path = require('path');
|
const path = require('path');
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const child_process = require('child_process');
|
const child_process = require('child_process');
|
||||||
|
let buildingInProgress = false;
|
||||||
|
let currentBuildingModule = '';
|
||||||
|
|
||||||
const yarnBuildTask = {
|
const yarnBuildTask = {
|
||||||
shouldBuild(resourceName) {
|
shouldBuild(resourceName) {
|
||||||
@ -30,33 +32,49 @@ const yarnBuildTask = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
build(resourceName, cb) {
|
build(resourceName, cb) {
|
||||||
const process = child_process.fork(
|
let buildYarn = async () => {
|
||||||
require.resolve('./yarn_cli.js'),
|
while (buildingInProgress) {
|
||||||
['install'],
|
console.log(`yarn is busy by another process: we are waiting to compile ${resourceName}`);
|
||||||
{
|
await sleep(3000);
|
||||||
cwd: path.resolve(GetResourcePath(resourceName))
|
}
|
||||||
});
|
buildingInProgress = true;
|
||||||
|
currentBuildingModule = resourceName;
|
||||||
process.on('exit', (code, signal) => {
|
const process = child_process.fork(
|
||||||
setImmediate(() => {
|
require.resolve('./yarn_cli.js'),
|
||||||
if (code != 0 || signal) {
|
['install'],
|
||||||
cb(false, 'yarn failed!');
|
{
|
||||||
return;
|
cwd: path.resolve(GetResourcePath(resourceName))
|
||||||
}
|
});
|
||||||
|
|
||||||
const resourcePath = GetResourcePath(resourceName);
|
|
||||||
const yarnLock = path.resolve(resourcePath, 'yarn.lock');
|
|
||||||
|
|
||||||
try {
|
|
||||||
fs.utimesSync(yarnLock, new Date(), new Date());
|
|
||||||
} catch (e) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
cb(true);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
RegisterResourceBuildTaskFactory('yarn', () => yarnBuildTask);
|
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);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
buildYarn().then();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function sleep(ms) {
|
||||||
|
return new Promise(resolve => setTimeout(resolve, ms));
|
||||||
|
}
|
||||||
|
RegisterResourceBuildTaskFactory('yarn', () => yarnBuildTask);
|
||||||
|
Loading…
Reference in New Issue
Block a user