diff --git a/packages/config/src/index.ts b/packages/config/src/index.ts index 321aee9e7d..04dd73ffa3 100644 --- a/packages/config/src/index.ts +++ b/packages/config/src/index.ts @@ -86,6 +86,7 @@ export default async ( const npmConfig = loadNpmConf(cliArgs, types, { 'bail': true, 'globalconfig': npmDefaults.globalconfig, + 'lock': true, 'package-lock': npmDefaults['package-lock'], 'prefix': npmDefaults.prefix, 'registry': npmDefaults.registry, diff --git a/packages/pnpm/src/cmd/install.ts b/packages/pnpm/src/cmd/install.ts index 9fea33ce13..abe7316d83 100644 --- a/packages/pnpm/src/cmd/install.ts +++ b/packages/pnpm/src/cmd/install.ts @@ -1,4 +1,9 @@ -import {install, installPkgs} from 'supi' +import {StoreController} from 'package-store' +import { + install, + InstallOptions, + installPkgs, +} from 'supi' import createStoreController from '../createStoreController' import requireHooks from '../requireHooks' import {PnpmOptions} from '../types' @@ -10,7 +15,10 @@ import {PnpmOptions} from '../types' */ export default async function installCmd ( input: string[], - opts: PnpmOptions, + opts: PnpmOptions & { + store?: string, + storeController?: StoreController, + }, ) { // `pnpm install ""` is going to be just `pnpm install` input = input.filter(Boolean) @@ -20,11 +28,17 @@ export default async function installCmd ( opts.hooks = requireHooks(prefix, opts) } - const store = await createStoreController(opts) - const installOpts = Object.assign(opts, { - store: store.path, - storeController: store.ctrl, - }) + const installOpts = ( + opts.storeController && opts.store + ? opts + : await (async () => { + const store = await createStoreController(opts) + return Object.assign(opts, { + store: store.path, + storeController: store.ctrl, + }) + })() + ) as InstallOptions if (!input || !input.length) { return install(installOpts) diff --git a/packages/pnpm/src/cmd/link.ts b/packages/pnpm/src/cmd/link.ts index 510a6b0eae..4d1900bd62 100644 --- a/packages/pnpm/src/cmd/link.ts +++ b/packages/pnpm/src/cmd/link.ts @@ -54,10 +54,17 @@ export default async ( globalPkgNames.forEach((pkgName) => pkgPaths.push(path.join(globalPkgPath, 'node_modules', pkgName))) } + // TODO: allow the linked packages to use different stores await Promise.all( pkgPaths.map((prefix) => installLimit(async () => - await install([], await getConfigs({...opts.cliArgs, prefix}, {excludeReporter: true})), + await install([], { + ...await getConfigs({...opts.cliArgs, prefix}, {excludeReporter: true}), + store: linkOpts.store, + storeController: linkOpts.storeController, + }), )), ) await link(pkgPaths, path.join(cwd, 'node_modules'), linkOpts) + + await linkOpts.storeController.close() } diff --git a/packages/pnpm/src/createStore.ts b/packages/pnpm/src/createStore.ts index a35189c703..2496751e70 100644 --- a/packages/pnpm/src/createStore.ts +++ b/packages/pnpm/src/createStore.ts @@ -1,6 +1,5 @@ import createFetcher from '@pnpm/default-fetcher' import createResolver from '@pnpm/default-resolver' -import { StrictPnpmOptions } from '@pnpm/types' import LRU = require('lru-cache') import createStore from 'package-store' import path = require('path') @@ -9,7 +8,7 @@ export default async ( opts: { registry?: string, rawNpmConfig: object, - lock?: boolean, + lock: boolean, store: string, alwaysAuth?: boolean, strictSsl?: boolean, @@ -31,6 +30,7 @@ export default async ( packageImportMethod?: 'auto' | 'hardlink' | 'copy' | 'reflink', }, ) => { + // TODO: either print a warning or just log if --no-lock is used const sopts = Object.assign(opts, { locks: opts.lock ? path.join(opts.store, '_locks') : undefined, registry: opts.registry || 'https://registry.npmjs.org/', diff --git a/packages/pnpm/src/createStoreController.ts b/packages/pnpm/src/createStoreController.ts index faa43bfc71..188080d941 100644 --- a/packages/pnpm/src/createStoreController.ts +++ b/packages/pnpm/src/createStoreController.ts @@ -2,7 +2,6 @@ import logger from '@pnpm/logger' import {connectStoreController} from '@pnpm/server' import storePath from '@pnpm/store-path' import delay = require('delay') -import loadJsonFile = require('load-json-file') import fs = require('mz/fs') import {StoreController} from 'package-store' import path = require('path') @@ -30,7 +29,7 @@ export default async function ( userAgent?: string, ignoreFile?: (filename: string) => boolean, offline?: boolean, - lock?: boolean, + lock: boolean, lockStaleDuration?: number, networkConcurrency?: number, store?: string, diff --git a/packages/pnpm/src/types.ts b/packages/pnpm/src/types.ts index c8b4657b7c..36f5df6133 100644 --- a/packages/pnpm/src/types.ts +++ b/packages/pnpm/src/types.ts @@ -63,7 +63,7 @@ export interface PnpmOptions { networkConcurrency?: number, fetchingConcurrency?: number, lockStaleDuration?: number, - lock?: boolean, + lock: boolean, childConcurrency?: number, repeatInstallDepth?: number, ignorePnpmfile?: boolean, diff --git a/packages/pnpm/test/link.ts b/packages/pnpm/test/link.ts index 5adb49a7ff..16afefadc7 100644 --- a/packages/pnpm/test/link.ts +++ b/packages/pnpm/test/link.ts @@ -9,7 +9,6 @@ import writePkg = require('write-pkg') import { pathToLocalPkg, prepare, - testDefaults, execPnpm, } from './utils' import fs = require('mz/fs')