纱线分辨率的npm当量?

纱线分辨率的npm当量?,npm,package.json,yarnpkg,webpack,Npm,Package.json,Yarnpkg,Webpack,是否有与此功能相当的npm?npm package.json中没有提到它 例如,我想安装lerna@3.3.2及其3.3.2中的一个依赖项(@lerna/publish)。目前使用warn这样做,但更喜欢使用npm,而不是手动更改package lock.json或任何类似的狡猾行为 "devDependencies": { "lerna": "3.3.2", }, "resolutions": { &quo

是否有与此功能相当的
npm
?npm package.json中没有提到它

例如,我想安装
lerna@3.3.2
及其3.3.2中的一个依赖项(@lerna/publish)。目前使用
warn
这样做,但更喜欢使用npm,而不是手动更改
package lock.json
或任何类似的狡猾行为

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

npm本机似乎不支持此功能,但此软件包旨在添加此功能:

是由于支持,这相当于纱线的
分辨率

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


据我所知,
npm强制分辨率
不适用于v7。和
npm力分辨率
不再更新相关字段

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

#/usr/bin/env节点
/*eslint禁用独角兽/防止缩写*/
/*eslint禁用导入/明确*/
/*eslint禁用导入/无commonjs*/
/*eslint禁用节点/shebang*/
const fs=要求('fs')。承诺;
const path=require('path');
常量main=async(分辨率)=>{
const packageLockFilePath=path.resolve(uu dirname,'../package lock.json');
for(对象项的常量[名称,版本](分辨率)){
const packageLock=JSON.parse(等待fs.readFile(packageLockFilePath));
const packagepath=Object.key(packageLock.packages);
常量deletepath=[];
for(packagePath的常量packagePath){
if(packagePath.endsWith('/'+名称)){
if(packageLock.packages[packagePath].version!==版本){
deletepath.push(packagePath);
}
}
}
for(删除路径的常量packagePath){
for(删除路径的常量deletePath){
if(packagePath==deletePath | | packagePath.startsWith(deletePath+'/')){
//eslint禁用下一行fp/no delete
删除packageLock.packages[packagePath];
}
}
}
等待fs.writeFile(
packageLockFilePath,
stringify(packageLock,null,'),
);
}
};
main(需要('../package.json')。分辨率);
此脚本仅删除指向不满足
package.json
中定义的
解析的依赖项的所有链接

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

{
“脚本”:{
“postinstall”:“node bin/fix package lock.js”
},
“决议”:{
“网页包”:“5.6.0”
}
}

resolutions
只是包名和应保存在依赖关系树中的包的确切版本的映射,即上述配置将删除所有不属于
5.6.0
的版本。只要您安装
webpack@5.6.0
version作为您正在使用的项目的一个依赖项,这将保证所有包加载相同版本的webpack。

Npm等同于您正在使用的项目。在项目被接受后,现在有一个史诗来观察实施的进展

您知道npm收缩包装的相关信息吗?这可能对你有用。请参阅:请注意,
npm强制分辨率
不适用于npm v7。@Gajus:建议它现在适用于npm 7。npm力分辨率的相应版本为
0.0.10