diff --git a/.changeset/neat-bobcats-raise.md b/.changeset/neat-bobcats-raise.md new file mode 100644 index 0000000000..889a1e7111 --- /dev/null +++ b/.changeset/neat-bobcats-raise.md @@ -0,0 +1,7 @@ +--- +"@pnpm/plugin-commands-installation": minor +"@pnpm/config": minor +"pnpm": minor +--- + +Added a new setting called `optimistic-repeat-install`. When enabled, a fast check will be performed before proceeding to installation. This way a repeat install or an install on a project with everything up-to-date becomes a lot faster. But some edge cases might arise, so we keep it disabled by default for now [#8977](https://github.com/pnpm/pnpm/pull/8977). diff --git a/config/config/src/Config.ts b/config/config/src/Config.ts index 0baa2d45f1..64a4c9c3b3 100644 --- a/config/config/src/Config.ts +++ b/config/config/src/Config.ts @@ -45,6 +45,7 @@ export interface Config { ignoreScripts?: boolean ignoreCompatibilityDb?: boolean includeWorkspaceRoot?: boolean + optimisticRepeatInstall?: boolean save?: boolean saveProd?: boolean saveDev?: boolean diff --git a/config/config/src/index.ts b/config/config/src/index.ts index fe01d4ecb3..c323c2b15e 100644 --- a/config/config/src/index.ts +++ b/config/config/src/index.ts @@ -147,6 +147,7 @@ export async function getConfig (opts: { 'hoist-workspace-packages': true, 'ignore-workspace-cycles': false, 'ignore-workspace-root-check': false, + 'optimistic-repeat-install': false, 'inject-workspace-packages': false, 'link-workspace-packages': false, 'lockfile-include-tarball-url': false, diff --git a/config/config/src/types.ts b/config/config/src/types.ts index 565b1d18d7..dbca930841 100644 --- a/config/config/src/types.ts +++ b/config/config/src/types.ts @@ -42,6 +42,7 @@ export const types = Object.assign({ 'ignore-workspace': Boolean, 'ignore-workspace-cycles': Boolean, 'ignore-workspace-root-check': Boolean, + 'optimistic-repeat-install': Boolean, 'include-workspace-root': Boolean, 'inject-workspace-packages': Boolean, 'legacy-dir-filtering': Boolean, diff --git a/pkg-manager/plugin-commands-installation/src/install.ts b/pkg-manager/plugin-commands-installation/src/install.ts index 34130e3be2..977484d14e 100644 --- a/pkg-manager/plugin-commands-installation/src/install.ts +++ b/pkg-manager/plugin-commands-installation/src/install.ts @@ -29,6 +29,7 @@ export function rcOptionsTypes (): Record { 'https-proxy', 'ignore-pnpmfile', 'ignore-scripts', + 'optimistic-repeat-install', 'link-workspace-packages', 'lockfile-dir', 'lockfile-directory', @@ -114,6 +115,10 @@ For options that may be used with `-r`, see "pnpm help recursive"', name: '--dev', shortAlias: '-D', }, + { + description: 'Skip reinstall if the workspace state is up-to-date', + name: '--optimistic-repeat-install', + }, { description: '`optionalDependencies` are not installed', name: '--no-optional', diff --git a/pkg-manager/plugin-commands-installation/src/installDeps.ts b/pkg-manager/plugin-commands-installation/src/installDeps.ts index 3a26a6356b..9c77e63e4f 100644 --- a/pkg-manager/plugin-commands-installation/src/installDeps.ts +++ b/pkg-manager/plugin-commands-installation/src/installDeps.ts @@ -65,6 +65,7 @@ export type InstallDepsOptions = Pick { - if (!opts.update && !opts.dedupe && params.length === 0) { + if (!opts.update && !opts.dedupe && params.length === 0 && opts.optimisticRepeatInstall) { const { upToDate } = await checkDepsStatus({ ...opts, ignoreFilteredInstallCache: true,