diff --git a/packages/@vue/cli-shared-utils/lib/env.js b/packages/@vue/cli-shared-utils/lib/env.js index de5b383929..bfa69fb627 100644 --- a/packages/@vue/cli-shared-utils/lib/env.js +++ b/packages/@vue/cli-shared-utils/lib/env.js @@ -130,6 +130,21 @@ function checkPnpm (result) { return result } +const _npmProjects = new LRU({ + max: 10, + maxAge: 1000 +}) +exports.hasProjectNpm = (cwd) => { + if (_npmProjects.has(cwd)) { + return true + } + + const lockFile = path.join(cwd, 'package-lock.json') + const result = fs.existsSync(lockFile) + _npmProjects.set(cwd, result) + return result +} + // OS exports.isWindows = process.platform === 'win32' exports.isMacintosh = process.platform === 'darwin' diff --git a/packages/@vue/cli/lib/util/ProjectPackageManager.js b/packages/@vue/cli/lib/util/ProjectPackageManager.js index 5bbb2ca4d2..2c1ab10a8d 100644 --- a/packages/@vue/cli/lib/util/ProjectPackageManager.js +++ b/packages/@vue/cli/lib/util/ProjectPackageManager.js @@ -18,6 +18,7 @@ const { hasPnpm3OrLater, hasPnpmVersionOrLater, hasProjectPnpm, + hasProjectNpm, isOfficialPlugin, resolvePluginId, @@ -88,8 +89,17 @@ class PackageManager { if (forcePackageManager) { this.bin = forcePackageManager } else if (context) { - this.bin = hasProjectYarn(context) ? 'yarn' : hasProjectPnpm(context) ? 'pnpm' : 'npm' - } else { + if (hasProjectYarn(context)) { + this.bin = 'yarn' + } else if (hasProjectPnpm(context)) { + this.bin = 'pnpm' + } else if (hasProjectNpm(context)) { + this.bin = 'npm' + } + } + + // if no package managers specified, and no lockfile exists + if (!this.bin) { this.bin = loadOptions().packageManager || (hasYarn() ? 'yarn' : hasPnpm3OrLater() ? 'pnpm' : 'npm') }