Prevent races by blocking on SDK builds
If we don't block on SDK builds, then the riot-web build fails due to half-built dependencies. This needs to be done at two levels: the js-sdk because it is used by both the react-sdk and riot-web, and at the react-sdk because riot-web needs it. This means our build process is synchronous for js -> react -> riot, at least for the initial build. This does increase the startup time, particularly because the file watch timer is at 5 seconds. The timer is used to detect a storm of file changes in the underlying SDKs and give the build process some room to compile larger files if needed. The file watcher is accompanied by a "canary signal file" to prevent the build-blocking script from unblocking too early. Both the js and react SDKs build when `npm install` is run, so we ensure that we only listen for the `npm start` build for each SDK. This is all done at the riot level instead of at the individual SDK levels (where we could use a canary file to signal up the stack) because: * babel (used by the js-sdk) doesn't really provide an "end up build" signal * webpack is a bit of a nightmare to get it to behave at times * this blocking approach is really only applicable to riot-web, although may be useful to some other projects. Hopefully that all makes sense.
This commit is contained in:
parent
c6da122e41
commit
2b037ee146
5 changed files with 97 additions and 8 deletions
|
@ -36,9 +36,34 @@ if (fs.existsSync(path.join(sdkPath, '.git'))) {
|
|||
});
|
||||
}
|
||||
|
||||
console.log("Sending signal that other processes may unblock");
|
||||
triggerCanarySignal(sdkName);
|
||||
|
||||
console.log("Performing task: " + task);
|
||||
child_process.execSync(`npm ${task === "build" ? "run build" : "start"}`, {
|
||||
env: process.env,
|
||||
cwd: sdkPath,
|
||||
});
|
||||
}
|
||||
|
||||
function triggerCanarySignal(sdkName) {
|
||||
const tmpPath = path.resolve(".tmp");
|
||||
|
||||
try {
|
||||
fs.mkdirSync(tmpPath);
|
||||
} catch (e) {
|
||||
if (e.code !== 'EEXIST') {
|
||||
console.error(e);
|
||||
throw "Failed to create temporary directory";
|
||||
}
|
||||
}
|
||||
|
||||
// Note: we intentionally create then delete the file to work around
|
||||
// a file watching problem where if the file exists on startup it may
|
||||
// fire a "created" event for the file. By having the behaviour be "do
|
||||
// something on delete" we avoid accidentally firing the signal too
|
||||
// early.
|
||||
const canaryPath = path.join(tmpPath, sdkName);
|
||||
fs.closeSync(fs.openSync(canaryPath, 'w'));
|
||||
fs.unlinkSync(canaryPath);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue