diff --git a/src/api/getContext.ts b/src/api/getContext.ts index 8e1f5b71f7..adda9308cb 100644 --- a/src/api/getContext.ts +++ b/src/api/getContext.ts @@ -18,6 +18,7 @@ import {PackageJson} from '@pnpm/types' import normalizePath = require('normalize-path') import removeAllExceptOuterLinks = require('remove-all-except-outer-links') import logger from '@pnpm/logger' +import R = require('ramda') import checkCompatibility from './checkCompatibility' import {packageJsonLogger} from '../loggers' @@ -83,12 +84,13 @@ export default async function getContext ( readCurrentShrinkwrap(root, shrOpts), mkdirp(storePath), ]) + const currentShrinkwrap = files[2] || createShrinkwrap(opts.registry) const ctx: PnpmContext = { pkg: files[0], root, storePath, - wantedShrinkwrap: files[1] || createShrinkwrap(opts.registry), - currentShrinkwrap: files[2] || createShrinkwrap(opts.registry), + wantedShrinkwrap: files[1] || !opts.shrinkwrap && currentShrinkwrap && R.clone(currentShrinkwrap) || createShrinkwrap(opts.registry), + currentShrinkwrap, existsWantedShrinkwrap: !!files[1], existsCurrentShrinkwrap: !!files[2], skipped: new Set(modules && modules.skipped || []), diff --git a/test/shrinkwrap.ts b/test/shrinkwrap.ts index 929819553d..f0582e2e60 100644 --- a/test/shrinkwrap.ts +++ b/test/shrinkwrap.ts @@ -824,3 +824,13 @@ test('fail when installing with shrinkwrap: false and shrinkwrapOnly: true', asy t.equal(err.message, 'Cannot generate a shrinkwrap.yaml because shrinkwrap is set to false') } }) + +test("don't remove packages during named install when shrinkwrap: false", async (t: tape.Test) => { + const project = prepare(t) + + await installPkgs(['is-positive'], await testDefaults({shrinkwrap: false})) + await installPkgs(['is-negative'], await testDefaults({shrinkwrap: false})) + + await project.has('is-positive') + await project.has('is-negative') +})