npm相当于纱线的分辨率?

时间:2018-09-20 01:37:30

标签: npm package.json yarnpkg

是否有等效于yarn resolutions功能的npm?在npm package.json docs中没有提及它。

例如,我也想在3.3.2上安装lerna@3.3.2及其依赖项之一(@ lerna / publish)。目前,这种方式是使用yarn进行的,但是更愿意使用npm而不是手动更改package-lock.json或类似的狡猾方法。

"devDependencies": {
  "lerna": "3.3.2",
},
"resolutions": {
  "@lerna/publish": "3.3.2"
}

4 个答案:

答案 0 :(得分:15)

npm本身不支持此功能,但是此软件包旨在添加此功能:

https://github.com/rogeriochaves/npm-force-resolutions

答案 1 :(得分:2)

是由于对overrides的支持,这与纱线的resolutions相同。

有关当前RFC状态的更多信息:

https://github.com/npm/rfcs/blob/latest/accepted/0009-package-overrides.md

答案 2 :(得分:1)

据我所知,npm-force-resolutions v7中不起作用。 package-lock.json format changed in v7npm-force-resolutions不再更新相关字段。

但是,编写脚本以将依赖关系树限制为仅一个版本的软件包相对容易,例如

#!/usr/bin/env node

/* eslint-disable unicorn/prevent-abbreviations */
/* eslint-disable import/unambiguous */
/* eslint-disable import/no-commonjs */
/* eslint-disable node/shebang */

const fs = require('fs').promises;
const path = require('path');

const main = async (resolutions) => {
  const packageLockFilePath = path.resolve(__dirname, '../package-lock.json');

  for (const [name, version] of Object.entries(resolutions)) {
    const packageLock = JSON.parse(await fs.readFile(packageLockFilePath));

    const packagePaths = Object.keys(packageLock.packages);

    const deletePaths = [];

    for (const packagePath of packagePaths) {
      if (packagePath.endsWith('/' + name)) {
        if (packageLock.packages[packagePath].version !== version) {
          deletePaths.push(packagePath);
        }
      }
    }

    for (const packagePath of deletePaths) {
      for (const deletePath of deletePaths) {
        if (packagePath === deletePath || packagePath.startsWith(deletePath + '/')) {
          // eslint-disable-next-line fp/no-delete
          delete packageLock.packages[packagePath];
        }
      }
    }

    await fs.writeFile(
      packageLockFilePath,
      JSON.stringify(packageLock, null, '  '),
    );
  }
};

main(require('../package.json').resolutions);

此脚本仅删除不满足resolutions中定义的package.json的依赖项的所有链接。

要执行脚本,只需将其添加到package.json scripts并定义resolutions字段,例如

{
  "scripts": {
    "postinstall": "node bin/fix-package-lock.js"
  },
  "resolutions": {
    "webpack": "5.6.0"
  }
}

resolutions只是软件包名称和应保留在依赖关系树中的那些软件包的确切版本的映射,即,上述配置将删除所有而非{{ 1}}。只要您安装5.6.0版本作为您正在处理的项目的依赖项,这将确保所有软件包都加载相同版本的webpack。

答案 3 :(得分:1)

Npm 相当于纱线分辨率是覆盖。在 RFC 被接受之后,现在有一个史诗可以观察实施的进度。 https://github.com/npm/statusboard/issues/343