diff --git a/packages/create-nx-workspace/bin/create-nx-workspace.ts b/packages/create-nx-workspace/bin/create-nx-workspace.ts index 04f4f0baaa..0b94d1fa48 100644 --- a/packages/create-nx-workspace/bin/create-nx-workspace.ts +++ b/packages/create-nx-workspace/bin/create-nx-workspace.ts @@ -100,27 +100,48 @@ function showHelp() { } function determinePackageManager() { + let packageManager = getPackageManagerFromAngularCLI(); + if (packageManager === 'npm' || isPackageManagerInstalled(packageManager)) { + return packageManager; + } + + if (isPackageManagerInstalled('yarn')) { + return 'yarn'; + } + + if (isPackageManagerInstalled('pnpm')) { + return 'pnpm'; + } + + return 'npm'; +} + +function getPackageManagerFromAngularCLI(): string { // If you have Angular CLI installed, read Angular CLI config. - // If it isn't not installed, default to 'yarn'. - let packageManager: string; + // If it isn't installed, default to 'yarn'. try { - packageManager = execSync('ng config -g cli.packageManager', { + return execSync('ng config -g cli.packageManager', { stdio: ['ignore', 'pipe', 'ignore'], timeout: 500 }) .toString() .trim(); } catch (e) { - packageManager = 'yarn'; + return 'yarn'; } +} + +function isPackageManagerInstalled(packageManager: string) { + let isInstalled = false; try { execSync(`${packageManager} --version`, { stdio: ['ignore', 'ignore', 'ignore'] }); + isInstalled = true; } catch (e) { - packageManager = 'npm'; + /* do nothing */ } - return packageManager; + return isInstalled; } function determineWorkspaceName(parsedArgs: any) { diff --git a/packages/tao/src/commands/generate.ts b/packages/tao/src/commands/generate.ts index a5f5be018a..3c9120e210 100644 --- a/packages/tao/src/commands/generate.ts +++ b/packages/tao/src/commands/generate.ts @@ -32,6 +32,7 @@ import { logger } from '../shared/logger'; import { commandName, printHelp } from '../shared/print-help'; import * as fs from 'fs'; import minimist = require('minimist'); +import { execSync } from 'child_process'; interface GenerateOptions { collectionName: string; @@ -161,20 +162,48 @@ async function detectPackageManager( } } - const yarnLockFileExists = await host.exists('yarn.lock' as any).toPromise(); - if (yarnLockFileExists) { + if (await fileExists(host, 'yarn.lock')) { return 'yarn'; } - const pnpmLockFileExists = await host - .exists('pnpm-lock.yaml' as any) - .toPromise(); - if (pnpmLockFileExists) { + + if (await fileExists(host, 'pnpm-lock.yaml')) { + return 'pnpm'; + } + + if (await fileExists(host, 'package-lock.json')) { + return 'npm'; + } + + // If we get here, there are no lock files, so lets check for package managers in our preferred order + if (isPackageManagerInstalled('yarn')) { + return 'yarn'; + } + + if (isPackageManagerInstalled('pnpm')) { return 'pnpm'; } return 'npm'; } +function fileExists( + host: virtualFs.Host, + fileName: string +): Promise { + return host.exists(fileName as any).toPromise(); +} + +function isPackageManagerInstalled(packageManager: string) { + try { + execSync(`${packageManager} --version`, { + stdio: ['ignore', 'ignore', 'ignore'] + }); + return true; + } catch (e) { + return false; + } +} + async function createWorkflow( fsHost: virtualFs.Host, root: string,