npm 只安装包.json中的一个包?

mwecs4sa  于 2023-02-23  发布在  其他
关注(0)|答案(3)|浏览(158)

假设在我的package.json中有:

"dependencies": {
    "bower": "1.0.0",
    // zillion other dependencies
}

有没有办法让npm从我的package.json只安装bower@1.0.0?npm install --only bower.
我的目标是使npm installbower install同时运行。

j0pj023g

j0pj023g1#

作为一种解决方法,您可以使用以下方法:

$ node -pe "require('./package').dependencies.bower"
// → 1.0.0
$ npm install bower@$(node -pe "require('./package').dependencies.bower")
// npm install bower@1.0.0

// or with jq
$ npm install bower@$(< package.json jq -r '.dependencies.bower')

其中,-e/--eval标志计算传递的字符串,-p/--print打印计算结果。
💡 请考虑其他答案,因为这一个可能已经过时。

z8dt9xmd

z8dt9xmd2#

正如@atalantus在评论中所指出的,可接受的答案在新版本的NPM上不起作用。新版本的工作解决方案(在NPM 6.13.4上验证)是:

npm install --no-package-lock --no-save bower@1.0.0

这将安装bower及其所有依赖项,但阻止安装package.json中的任何其他内容。它也不会创建或修改现有的package-lock.json
来自npm文档:
--no-package-lock参数将阻止npm创建package-lock.json文件。当在package-lock被禁用的情况下运行时,npm将不会在安装时自动删除节点模块。
--no-save:防止保存到dependencies
结合Anton Rudeshko在package.json中查找版本的方法,最终的解决方案是:

VERSION_BOWER=`node -p -e "require('./package.json').dependencies.bower"`
npm install --no-package-lock --no-save bower@"$VERSION_BOWER"

更新2023

我刚才使用的另一个解决方案是临时修改package.json,只保留您需要的依赖关系。
给定包. json

{
  "name": "sample",
  "main": "src/index.js",
  "dependencies": {
    "bower": "1.0.0",
    "foo": "^1.2.3",
    "bar": "^4.5.6",
  },
  "devDependencies": {
    "baz": "^10.20.30",
  }
}

我们首先使用jq对其进行修改,以仅保留bower

cat package.json| jq 'del(.devDependencies) | .dependencies |= {bower:.bower}'

给了我们

{
  "name": "sample",
  "main": "src/index.js",
  "dependencies": {
    "bower": "1.0.0"
  }
}

通过完全删除devDependencies并且在dependencies中仅留下bower
接下来,您可能希望用这个新版本覆盖package.json,但不能像这样直接执行

cat package.json | jq 'del(.devDependencies) | .dependencies |= {bower:.bower}' > package.json

因为文件在被完全读取之前就被覆盖了。相反,你需要缓冲jq命令的输出流,最简单的解决方案是将其存储在变量中,然后覆盖原始文件

updated=`cat package.json | jq 'del(.devDependencies) | .dependencies |= {bower:.bower}'`
echo $updated > package.json

package.json现在为:

cat package.json
{
  "name": "sample",
  "main": "src/index.js",
  "dependencies": {
    "bower": "1.0.0"
  }
}

现在运行npm install,您将只安装bower@1.0.0
显然,我们并不总是可以修改文件,但你也可以备份原始文件,等等。这里的要点是如何轻松地修改json文件感谢jq,而不是玩魔术与sed:-)

des4xlb0

des4xlb03#

看到NPM的新版本以前的解决方案不再起作用,我想出了这个:

npm i -g --prefix=$(pwd) bower # $(pwd) = current directory, UNIX only
node bin/bower

全局安装一个包允许你指定一个“前缀”--一个安装包的目录。这里我只是把当前目录作为我想让包出现的文件夹。在CI中,这可能是你的repo根目录。
记住这将忽略你的package.json版本,只下载最新版本。如果你需要一个特定的版本,只需使用bower@someversion
另一种解决方案是rm package.json && npm i bower,如果您希望以后恢复它,则可以使用mv package.json _package.json && npm i bower

相关问题