是否有等效于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"
}
答案 0 :(得分:15)
npm本身不支持此功能,但是此软件包旨在添加此功能:
答案 1 :(得分:2)
npm是由于对overrides
的支持,这与纱线的resolutions
相同。
有关当前RFC状态的更多信息:
https://github.com/npm/rfcs/blob/latest/accepted/0009-package-overrides.md
答案 2 :(得分:1)
据我所知,npm-force-resolutions
在npm v7中不起作用。 package-lock.json
format changed in v7和npm-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
只是软件包名称和应保留在依赖关系树中的那些软件包的确切版本的映射,即,上述配置将删除所有webpack而非{{ 1}}。只要您安装5.6.0
版本作为您正在处理的项目的依赖项,这将确保所有软件包都加载相同版本的webpack。
答案 3 :(得分:1)
Npm 相当于纱线分辨率是覆盖。在 RFC 被接受之后,现在有一个史诗可以观察实施的进度。 https://github.com/npm/statusboard/issues/343