You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
2.6 KiB
70 lines
2.6 KiB
4 years ago
|
/**
|
||
|
* This file decorates the Angular CLI with the Nx CLI to enable features such as computation caching
|
||
|
* and faster execution of tasks.
|
||
|
*
|
||
|
* It does this by:
|
||
|
*
|
||
|
* - Patching the Angular CLI to warn you in case you accidentally use the undecorated ng command.
|
||
|
* - Symlinking the ng to nx command, so all commands run through the Nx CLI
|
||
|
* - Updating the package.json postinstall script to give you control over this script
|
||
|
*
|
||
|
* The Nx CLI decorates the Angular CLI, so the Nx CLI is fully compatible with it.
|
||
|
* Every command you run should work the same when using the Nx CLI, except faster.
|
||
|
*
|
||
|
* Because of symlinking you can still type `ng build/test/lint` in the terminal. The ng command, in this case,
|
||
|
* will point to nx, which will perform optimizations before invoking ng. So the Angular CLI is always invoked.
|
||
|
* The Nx CLI simply does some optimizations before invoking the Angular CLI.
|
||
|
*
|
||
|
* To opt out of this patch:
|
||
|
* - Replace occurrences of nx with ng in your package.json
|
||
|
* - Remove the script from your postinstall script in your package.json
|
||
|
* - Delete and reinstall your node_modules
|
||
|
*/
|
||
|
|
||
|
const fs = require('fs');
|
||
|
const os = require('os');
|
||
|
const cp = require('child_process');
|
||
|
const isWindows = os.platform() === 'win32';
|
||
|
let output;
|
||
|
try {
|
||
|
output = require('@nrwl/workspace').output;
|
||
|
} catch (e) {
|
||
|
console.warn('Angular CLI could not be decorated to enable computation caching. Please ensure @nrwl/workspace is installed.');
|
||
|
process.exit(0);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Symlink of ng to nx, so you can keep using `ng build/test/lint` and still
|
||
|
* invoke the Nx CLI and get the benefits of computation caching.
|
||
|
*/
|
||
|
function symlinkNgCLItoNxCLI() {
|
||
|
try {
|
||
|
const ngPath = './node_modules/.bin/ng';
|
||
|
const nxPath = './node_modules/.bin/nx';
|
||
|
if (isWindows) {
|
||
|
/**
|
||
|
* This is the most reliable way to create symlink-like behavior on Windows.
|
||
|
* Such that it works in all shells and works with npx.
|
||
|
*/
|
||
|
['', '.cmd', '.ps1'].forEach(ext => {
|
||
|
if (fs.existsSync(nxPath + ext)) fs.writeFileSync(ngPath + ext, fs.readFileSync(nxPath + ext));
|
||
|
});
|
||
|
} else {
|
||
|
// If unix-based, symlink
|
||
|
cp.execSync(`ln -sf ./nx ${ngPath}`);
|
||
|
}
|
||
|
}
|
||
|
catch(e) {
|
||
|
output.error({ title: 'Unable to create a symlink from the Angular CLI to the Nx CLI:' + e.message });
|
||
|
throw e;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
symlinkNgCLItoNxCLI();
|
||
|
require('@nrwl/cli/lib/decorate-cli').decorateCli();
|
||
|
output.log({ title: 'Angular CLI has been decorated to enable computation caching.' });
|
||
|
} catch(e) {
|
||
|
output.error({ title: 'Decoration of the Angular CLI did not complete successfully' });
|
||
|
}
|