假设在我的package.json中有:
package.json
"dependencies": { "bower": "1.0.0", // zillion other dependencies }
有没有办法让npm从我的package.json中只安装bower@1.0.0?npm install --only bower.我的目标是使npm install和bower install同时运行。
npm install --only bower
npm install
bower install
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打印计算结果。💡 请考虑其他答案,因为这一个可能已经过时。
-e/--eval
-p/--print
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中查找版本的方法,最终的解决方案是:
bower
package-lock.json
--no-package-lock
--no-save
dependencies
VERSION_BOWER=`node -p -e "require('./package.json').dependencies.bower"` npm install --no-package-lock --no-save bower@"$VERSION_BOWER"
我刚才使用的另一个解决方案是临时修改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
jq
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,但不能像这样直接执行
devDependencies
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:-)
bower@1.0.0
sed
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
bower@someversion
rm package.json && npm i bower
mv package.json _package.json && npm i bower
3条答案
按热度按时间j0pj023g1#
作为一种解决方法,您可以使用以下方法:
其中,
-e/--eval
标志计算传递的字符串,-p/--print
打印计算结果。💡 请考虑其他答案,因为这一个可能已经过时。
z8dt9xmd2#
正如@atalantus在评论中所指出的,可接受的答案在新版本的NPM上不起作用。新版本的工作解决方案(在NPM 6.13.4上验证)是:
这将安装
bower
及其所有依赖项,但阻止安装package.json
中的任何其他内容。它也不会创建或修改现有的package-lock.json
。来自npm文档:
--no-package-lock
参数将阻止npm创建package-lock.json文件。当在package-lock被禁用的情况下运行时,npm将不会在安装时自动删除节点模块。--no-save
:防止保存到dependencies
。结合Anton Rudeshko在
package.json
中查找版本的方法,最终的解决方案是:更新2023
我刚才使用的另一个解决方案是临时修改
package.json
,只保留您需要的依赖关系。给定包. json
我们首先使用
jq
对其进行修改,以仅保留bower
给了我们
通过完全删除
devDependencies
并且在dependencies
中仅留下bower
。接下来,您可能希望用这个新版本覆盖package.json,但不能像这样直接执行
因为文件在被完全读取之前就被覆盖了。相反,你需要缓冲
jq
命令的输出流,最简单的解决方案是将其存储在变量中,然后覆盖原始文件package.json
现在为:现在运行
npm install
,您将只安装bower@1.0.0
。显然,我们并不总是可以修改文件,但你也可以备份原始文件,等等。这里的要点是如何轻松地修改json文件感谢
jq
,而不是玩魔术与sed
:-)des4xlb03#
看到NPM的新版本以前的解决方案不再起作用,我想出了这个:
全局安装一个包允许你指定一个“前缀”--一个安装包的目录。这里我只是把当前目录作为我想让包出现的文件夹。在CI中,这可能是你的repo根目录。
记住这将忽略你的package.json版本,只下载最新版本。如果你需要一个特定的版本,只需使用
bower@someversion
。另一种解决方案是
rm package.json && npm i bower
,如果您希望以后恢复它,则可以使用mv package.json _package.json && npm i bower