diff --git a/bin/install.js b/bin/install.js index dea58d60..e8de0301 100755 --- a/bin/install.js +++ b/bin/install.js @@ -164,6 +164,7 @@ for (const name of argv._) { version: p.fetchSpec || p.rawSpec, type: p.type, alias: aliasPackageName, + arg: p, }); } @@ -460,7 +461,6 @@ function getIgnoreScripts() { } async function updateDependencies(root, pkgs, propName, saveExact, remoteNames) { - const savePrefix = saveExact ? '' : getVersionSavePrefix(); const pkgFile = path.join(root, 'package.json'); const pkg = await utils.readJSON(pkgFile); const deps = pkg[propName] = pkg[propName] || {}; @@ -476,7 +476,16 @@ async function updateDependencies(root, pkgs, propName, saveExact, remoteNames) } else { const pkgDir = LOCAL_TYPES.includes(item.type) ? item.version : path.join(root, 'node_modules', item.name); const itemPkg = await utils.readJSON(path.join(pkgDir, 'package.json')); - deps[itemPkg.name] = `${savePrefix}${itemPkg.version}`; + + let saveSpec; + // If install with `cnpm i foo`, the type is tag but rawSpec is empty string + if (item.arg.type === 'tag' && item.arg.rawSpec) { + saveSpec = item.arg.rawSpec; + } else { + const savePrefix = saveExact ? '' : getVersionSavePrefix(); + saveSpec = `${savePrefix}${itemPkg.version}`; + } + deps[itemPkg.name] = saveSpec; } } // sort pkg[propName] diff --git a/test/installSaveDeps.test.js b/test/installSaveDeps.test.js index 33e0329f..c777d421 100644 --- a/test/installSaveDeps.test.js +++ b/test/installSaveDeps.test.js @@ -245,5 +245,21 @@ if (process.platform !== 'win32') { done(); }); }); + + it('install with dist-tag should update dependencies with tag', done => { + coffee.fork(helper.npminstall, [ + 'pedding@latest', + ], { + cwd: tmp, + }) + .expect('code', 0) + .end(err => { + assert(!err, err && err.message); + const deps = JSON.parse(fs.readFileSync(path.join(tmp, 'package.json'))).dependencies; + assert(deps); + assert(deps.pedding === 'latest'); + done(); + }); + }); }); }