Skip to content

Commit

Permalink
fix(@angular/cli): support silent package installs with Yarn 2+
Browse files Browse the repository at this point in the history
Yarn 2 and higher no longer support the `--silent` flag.
The Angular CLI will now spawn package managers with the stdout ignored when silent
mode is needed and only show stderr when the process exits unsuccessfully. This
provides the necessary functionality for the CLI without relying on package manager
options.

(cherry picked from commit 5378557)
  • Loading branch information
clydin committed May 27, 2022
1 parent e7b5ba5 commit b97772d
Showing 1 changed file with 12 additions and 14 deletions.
26 changes: 12 additions & 14 deletions packages/angular/cli/src/utilities/package-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ import { memoize } from './memoize';
import { Spinner } from './spinner';

interface PackageManagerOptions {
silent: string;
saveDev: string;
install: string;
installAll?: string;
Expand Down Expand Up @@ -79,28 +78,24 @@ export class PackageManagerUtils {
cwd?: string,
): Promise<boolean> {
const packageManagerArgs = this.getArguments();
const installArgs: string[] = [
packageManagerArgs.install,
packageName,
packageManagerArgs.silent,
];
const installArgs: string[] = [packageManagerArgs.install, packageName];

if (save === 'devDependencies') {
installArgs.push(packageManagerArgs.saveDev);
}

return this.run([...installArgs, ...extraArgs], cwd);
return this.run([...installArgs, ...extraArgs], { cwd, silent: true });
}

/** Install all packages. */
async installAll(extraArgs: string[] = [], cwd?: string): Promise<boolean> {
const packageManagerArgs = this.getArguments();
const installArgs: string[] = [packageManagerArgs.silent];
const installArgs: string[] = [];
if (packageManagerArgs.installAll) {
installArgs.push(packageManagerArgs.installAll);
}

return this.run([...installArgs, ...extraArgs], cwd);
return this.run([...installArgs, ...extraArgs], { cwd, silent: true });
}

/** Install a single package temporary. */
Expand Down Expand Up @@ -160,15 +155,13 @@ export class PackageManagerUtils {
switch (this.name) {
case PackageManager.Yarn:
return {
silent: '--silent',
saveDev: '--dev',
install: 'add',
prefix: '--modules-folder',
noLockfile: '--no-lockfile',
};
case PackageManager.Pnpm:
return {
silent: '--silent',
saveDev: '--save-dev',
install: 'add',
installAll: 'install',
Expand All @@ -177,7 +170,6 @@ export class PackageManagerUtils {
};
default:
return {
silent: '--quiet',
saveDev: '--save-dev',
install: 'install',
installAll: 'install',
Expand All @@ -187,15 +179,21 @@ export class PackageManagerUtils {
}
}

private async run(args: string[], cwd = process.cwd()): Promise<boolean> {
private async run(
args: string[],
options: { cwd?: string; silent?: boolean } = {},
): Promise<boolean> {
const { cwd = process.cwd(), silent = false } = options;

const spinner = new Spinner();
spinner.start('Installing packages...');

return new Promise((resolve) => {
const bufferedOutput: { stream: NodeJS.WriteStream; data: Buffer }[] = [];

const childProcess = spawn(this.name, args, {
stdio: 'pipe',
// Always pipe stderr to allow for failures to be reported
stdio: silent ? ['ignore', 'ignore', 'pipe'] : 'pipe',
shell: true,
cwd,
}).on('close', (code: number) => {
Expand Down

0 comments on commit b97772d

Please sign in to comment.