diff --git a/packages/@vue/cli-shared-utils/lib/env.js b/packages/@vue/cli-shared-utils/lib/env.js index 3c66418034..de5b383929 100644 --- a/packages/@vue/cli-shared-utils/lib/env.js +++ b/packages/@vue/cli-shared-utils/lib/env.js @@ -79,32 +79,37 @@ exports.hasProjectGit = (cwd) => { } let _hasPnpm -let _hasPnpm3orLater +let _pnpmVersion const _pnpmProjects = new LRU({ max: 10, maxAge: 1000 }) -exports.hasPnpm3OrLater = () => { - if (process.env.VUE_CLI_TEST) { - return true - } - if (_hasPnpm3orLater != null) { - return _hasPnpm3orLater +function getPnpmVersion () { + if (_pnpmVersion != null) { + return _pnpmVersion } try { - const pnpmVersion = execSync('pnpm --version', { + _pnpmVersion = execSync('pnpm --version', { stdio: ['pipe', 'pipe', 'ignore'] }).toString() // there's a critical bug in pnpm 2 // https://github.com/pnpm/pnpm/issues/1678#issuecomment-469981972 // so we only support pnpm >= 3.0.0 _hasPnpm = true - _hasPnpm3orLater = semver.gte(pnpmVersion, '3.0.0') - return _hasPnpm3orLater - } catch (e) { - return (_hasPnpm3orLater = false) + } catch (e) {} + return _pnpmVersion || '0.0.0' +} + +exports.hasPnpmVersionOrLater = (version) => { + if (process.env.VUE_CLI_TEST) { + return true } + return semver.gte(getPnpmVersion(), version) +} + +exports.hasPnpm3OrLater = () => { + return this.hasPnpmVersionOrLater('3.0.0') } exports.hasProjectPnpm = (cwd) => { diff --git a/packages/@vue/cli/lib/util/ProjectPackageManager.js b/packages/@vue/cli/lib/util/ProjectPackageManager.js index 2242137e5b..ce4865ad71 100644 --- a/packages/@vue/cli/lib/util/ProjectPackageManager.js +++ b/packages/@vue/cli/lib/util/ProjectPackageManager.js @@ -11,6 +11,7 @@ const { hasYarn, hasProjectYarn, hasPnpm3OrLater, + hasPnpmVersionOrLater, hasProjectPnpm } = require('@vue/cli-shared-utils/lib/env') const { isOfficialPlugin, resolvePluginId } = require('@vue/cli-shared-utils/lib/pluginResolution') @@ -32,6 +33,18 @@ const isTestOrDebug = process.env.VUE_CLI_TEST || process.env.VUE_CLI_DEBUG const TAOBAO_DIST_URL = 'https://npm.taobao.org/dist' const SUPPORTED_PACKAGE_MANAGERS = ['yarn', 'pnpm', 'npm'] +const PACKAGE_MANAGER_PNPM4_CONFIG = { + install: ['install', '--reporter', 'silent', '--shamefully-hoist'], + add: ['install', '--reporter', 'silent', '--shamefully-hoist'], + upgrade: ['update', '--reporter', 'silent'], + remove: ['uninstall', '--reporter', 'silent'] +} +const PACKAGE_MANAGER_PNPM3_CONFIG = { + install: ['install', '--loglevel', 'error', '--shamefully-flatten'], + add: ['install', '--loglevel', 'error', '--shamefully-flatten'], + upgrade: ['update', '--loglevel', 'error'], + remove: ['uninstall', '--loglevel', 'error'] +} const PACKAGE_MANAGER_CONFIG = { npm: { install: ['install', '--loglevel', 'error'], @@ -39,12 +52,7 @@ const PACKAGE_MANAGER_CONFIG = { upgrade: ['update', '--loglevel', 'error'], remove: ['uninstall', '--loglevel', 'error'] }, - pnpm: { - install: ['install', '--loglevel', 'error', '--shamefully-flatten'], - add: ['install', '--loglevel', 'error', '--shamefully-flatten'], - upgrade: ['update', '--loglevel', 'error'], - remove: ['uninstall', '--loglevel', 'error'] - }, + pnpm: hasPnpmVersionOrLater('4.0.0') ? PACKAGE_MANAGER_PNPM4_CONFIG : PACKAGE_MANAGER_PNPM3_CONFIG, yarn: { install: [], add: ['add'],