mirror of
https://github.com/angular/angular-cli.git
synced 2025-05-18 03:23:57 +08:00
56 lines
1.5 KiB
TypeScript
56 lines
1.5 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright Google Inc. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by an MIT-style license that can be
|
|
* found in the LICENSE file at https://angular.io/license
|
|
*/
|
|
import { execSync } from 'child_process';
|
|
import { existsSync } from 'fs';
|
|
import { join } from 'path';
|
|
import { getConfiguredPackageManager } from './config';
|
|
|
|
function supports(name: string): boolean {
|
|
try {
|
|
execSync(`${name} --version`, { stdio: 'ignore' });
|
|
|
|
return true;
|
|
} catch {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
export function supportsYarn(): boolean {
|
|
return supports('yarn');
|
|
}
|
|
|
|
export function supportsNpm(): boolean {
|
|
return supports('npm');
|
|
}
|
|
|
|
export function getPackageManager(root: string): string {
|
|
let packageManager = getConfiguredPackageManager();
|
|
if (packageManager) {
|
|
return packageManager;
|
|
}
|
|
|
|
const hasYarn = supportsYarn();
|
|
const hasYarnLock = existsSync(join(root, 'yarn.lock'));
|
|
const hasNpm = supportsNpm();
|
|
const hasNpmLock = existsSync(join(root, 'package-lock.json'));
|
|
|
|
if (hasYarn && hasYarnLock && !hasNpmLock) {
|
|
packageManager = 'yarn';
|
|
} else if (hasNpm && hasNpmLock && !hasYarnLock) {
|
|
packageManager = 'npm';
|
|
} else if (hasYarn && !hasNpm) {
|
|
packageManager = 'yarn';
|
|
} else if (hasNpm && !hasYarn) {
|
|
packageManager = 'npm';
|
|
}
|
|
|
|
// TODO: This should eventually inform the user of ambiguous package manager usage.
|
|
// Potentially with a prompt to choose and optionally set as the default.
|
|
return packageManager || 'npm';
|
|
}
|