我从另一个项目中复制了package.json,现在想将所有依赖项都升级到最新版本,因为这是一个新项目,如果出现问题,我不介意修复。
最简单的方法是什么?
我知道的最好的方法是运行npm info express版本,然后手动更新package.json中的每个依赖项。一定有更好的办法。
{
"name": "myproject",
"description": "my node project",
"version": "1.0.0",
"dependencies": {
"express": "^3.0.3", // how do I get these bumped to latest?
"mongodb": "^1.2.5",
"underscore": "^1.4.2"
}
}
有关纱线特定的解决方案,请参阅本堆栈溢出线程。
看来npm检查更新是现在实现这一点的唯一方法。
npm i -g npm-check-updates
ncu -u
npm install
在npm<3.11时:
只需将每个依赖项的版本更改为*,然后运行npm-update-save。(注:在最近(3.11)版本的npm中损坏)。
之前:
"dependencies": {
"express": "*",
"mongodb": "*",
"underscore": "*",
"rjs": "*",
"jade": "*",
"async": "*"
}
之后:
"dependencies": {
"express": "~3.2.0",
"mongodb": "~1.2.14",
"underscore": "~1.4.4",
"rjs": "~2.10.0",
"jade": "~0.29.0",
"async": "~0.2.7"
}
当然,这是更新依赖关系的钝锤。如果像你说的那样,项目是空的,没有什么可以打破,那就好了。
另一方面,如果您正在一个更成熟的项目中工作,那么您可能希望在升级之前验证您的依赖关系中没有发生破坏性变化。
要查看哪些模块过时,只需运行npm过时即可。它将列出所有已安装的具有较新版本的依赖项。
有关特定于纱线的解决方案,请参阅此StackOverflow答案。
npm check updates是一个实用程序,它使用所有依赖项的最新版本
看见https://www.npmjs.org/package/npm-check-updates
$ npm install -g npm-check-updates
$ ncu -u
$ npm install
[编辑]如果你有一个现代版本的npm,一种稍微不那么侵入性(避免全局安装)的方法是:
$ npx npm-check-updates -u
$ npm install
我最近不得不更新几个使用npm和package.json实现gruntfile.js魔法的项目。以下bash命令(多行命令)对我来说效果很好:
npm outdated --json --depth=0 | \
jq --ascii-output --monochrome-output '. | keys | .[]' | \
xargs npm install $1 --save-dev
这里的想法是:将npm过时的输出作为json传输到jq(jq是一个json命令行解析器/查询工具)(注意npm过时时使用--depth参数)jq将仅将输出剥离到顶级包名称。最后xargs将每个LIBRARYNAME一次一个放入npm install LIBRARYNAME--save dev命令
以上是我在机器运行时所做的工作:节点=v0.11.10 osx=10.9.2 npm=1.3.24
这需要:xargs公司http://en.wikipedia.org/wiki/Xargs(我相信是我的机器固有的)和jq公司http://stedolan.github.io/jq/(我用brew install jq安装了它)
注意:我只使用--save-dev将更新的库保存到json键devDependencies中的package.json,这是我的项目的要求,很可能不是你的。
之后,我用一个简单的
npm outdated --depth=0
此外,您可以使用
npm list --depth=0
要将一个依赖项更新到最新版本,而不必手动打开package.json并更改它,可以运行
npm install {package-name}@* {save flags?}
i.e.
npm install express@* --save
此流程与工作区兼容,即。
npm --workspace some/package install express@*
作为参考,npm install
注意:某些npm版本可能需要最新标志,即npm安装express@latest
正如用户Vespakoen在被拒绝的编辑中所指出的,也可以通过以下方式一次更新多个包:
npm install --save package-nave@* other-package@* whatever-thing@*
他还提出了一个基于npm过时的外壳的单线。有关代码和说明,请参见编辑。
PS:我也讨厌为这样的事情手动编辑package.json;)
使用*作为最新版本的版本,包括不稳定版本使用最新版本作为最新稳定版本的版本定义使用LatestStablePackages使用最新的稳定版本号修改package.json
下面是一个示例:
"dependencies": {
"express": "latest" // using the latest STABLE version
, "node-gyp": "latest"
, "jade": "latest"
, "mongoose": "*" // using the newest version, may involve the unstable releases
, "cookie-parser": "latest"
, "express-session": "latest"
, "body-parser": "latest"
, "nodemailer":"latest"
, "validator": "latest"
, "bcrypt": "latest"
, "formidable": "latest"
, "path": "latest"
, "fs-extra": "latest"
, "moment": "latest"
, "express-device": "latest"
},
为npm v2更新+
npm 2+(节点0.12+):
npm outdated
npm update
git commit package-lock.json
古代npm(约2014年):
npm install -g npm-check-updates
npm-check-updates
npm shrinkwrap
git commit package-lock.json
一定要收缩你的部门,否则你可能会导致一个失败的项目。前几天我做了一个项目,但它无法运行,因为我的部门都过时了/更新了/一团糟。如果我收缩,npm就会安装我所需要的东西。
细节
对于走到这一步的好奇者,我推荐如下:
使用npm检查更新或npm过时来建议最新版本。
# `outdated` is part of newer npm versions (2+)
$ npm outdated
# If you agree, update.
$ npm update
# OR
# Install and use the `npm-check-updates` package.
$ npm install -g npm-check-updates
# Then check your project
$ npm-check-updates
# If you agree, update package.json.
$ npm-check-updates -u
###然后进行一次干净的安装(没有rm,我收到了一些依赖性警告)
$ rm -rf node_modules
$ npm install
最后,使用npm-shrinkwrap将精确版本保存到npm-shrykwrap.json
$ rm npm-shrinkwrap.json
$ npm shrinkwrap
现在,npm安装将使用npm-shrinkwrap.json中的精确版本
如果将npm-shrinkwrap.json签入git,则所有安装都将使用完全相同的版本。
这是一种从开发(所有更新,所有时间)过渡到生产(无人接触任何东西)的方法。
npm过时npm检查更新npm包络线
p.s.Yarn正在将您的包裹列表发送到Facebook。
无需额外软件包的解决方案
将每个依赖项的版本更改为*:
"dependencies": {
"react": "*",
"react-google-maps": "*"
}
然后运行npm update--save。
您的一些软件包已更新,但有些没有更新?
"dependencies": {
"react": "^15.0.1",
"react-google-maps": "*"
}
这是一个棘手的部分,这意味着你的本地版本“react”比最新版本低。在本例中,npm下载并更新了“react”包。然而,您的本地版本“反应谷歌地图”与最新版本相同。
如果您仍然希望“更新”未更改*,则必须从node_modules文件夹中删除这些模块。
例如删除node_modules/react谷歌地图。
最后再次运行npm更新--save。
"dependencies": {
"react": "^15.0.1",
"react-google-maps": "^4.10.1"
}
如果您想更新开发依赖项,请不要忘记运行npm update--save dev。
如果您正在使用Github,请使用Greenkeeper。https://greenkeeper.io/
这是一个Github集成,非常容易设置。安装后,它会自动在您指定的存储库中创建拉取请求(如果需要,也可以全部创建),并使您的代码始终保持最新,而无需强制您手动执行任何操作。然后,PR应该在CI服务上触发构建,根据成功或失败的检查,您可以继续找出触发问题的原因,或者CI通过时,只需合并PR。
在底部,您可以看到第一个构建最初失败,在提交(“升级到节点v6.9”)后测试通过,因此我可以最终合并PR。还附带了很多表情符号。
另一种选择是https://dependencyci.com/然而,我没有集中测试它。乍一看,Greenkeeper在一般IMO中看起来更好,并具有更好的整合性。
我真的很喜欢npm升级的工作方式。这是一个简单的命令行实用程序,它可以遍历所有依赖项,让您查看当前版本与最新版本的比较,并根据需要进行更新。
以下是在项目根目录中运行npm升级后发生的情况的屏幕截图(在package.json文件旁边):
对于每个依赖项,您可以选择升级、忽略、查看更改日志或完成该过程。到目前为止,这对我来说效果很好。
要清楚,这是一个第三方软件包,需要在命令生效之前安装。它不附带npm本身:
npm install -g npm-upgrade
然后从具有package.json文件的项目的根目录:
npm-upgrade
用于更新NPM 3.10.10的package.json的命令:
npm install -g npm-check-updates
ncu -a
npm install
背景:
我使用的是@josh3736的最新命令,但我的package.json没有更新。然后,在运行npm检查更新-u时,我注意到了描述文本:
以下依赖性通过其声明的版本范围来满足,但安装的版本落后。您可以安装最新的版本,而无需使用npm更新来修改包文件。如果如果仍要更新包文件中的依赖项,请运行ncu-a。
阅读npm检查更新的文档,您可以看到不同之处:
https://www.npmjs.com/package/npm-check-updates
-u、 --升级:覆盖包文件-a、 --upgradeAll:甚至包括最新版本满足声明的semver依赖项的依赖项
ncu是npm check updates的别名,如键入npm check update-u时的消息所示:
[INFO]: You can also use ncu as an alias
要查看哪些软件包具有可用的更新版本,请使用以下命令:
npm outdated
要只更新一个依赖项,只需使用以下命令:
npm install yourPackage@latest
例如:
我的package.json文件具有依赖关系:
"@progress/kendo-angular-dateinputs": "^1.3.1",
那么我应该写:
npm install @progress/kendo-angular-dateinputs@latest
save dev是什么意思?
npm install @progress/kendo-angular-dateinputs@latest --save-dev
正如npm安装文档所说:
-D、 --save dev:Package将显示在devDependencies中。
下面的代码(已被接受)给我写了一些类似“这需要太长时间”之类的话,但什么也没做。可能使用全局标志是问题所在,idk。
npm i -g npm-check-updates
ncu -u
npm install
我决定使用文本编辑器,改用半手动方法。
我从package.json的dev依赖项中复制了一个这样的列表(只是长了很多)到记事本++文本编辑器:
"browserify": "10.2.6",
"expect.js": "^0.3.1",
"karma": "^0.13.22",
"karma-browserify": "^5.2.0",
我将搜索模式设置为正则表达式,使用^\s*“([^”]+)”.*$模式获取包名,并将其替换为npm uninstall\1-save dev\nnpm install\1-save-dev。单击“全部替换”。输出如下:
npm uninstall browserify --save-dev
npm install browserify --save-dev
npm uninstall expect.js --save-dev
npm install expect.js --save-dev
npm uninstall karma --save-dev
npm install karma --save-dev
npm uninstall karma-browserify --save-dev
npm install karma-browserify --save-dev
我把它复制回bash并按回车键。一切都升级了,工作正常。这就是全部。
"browserify": "^16.1.0",
"expect.js": "^0.3.1",
"karma": "^2.0.0",
"karma-browserify": "^5.2.0",
我认为这没什么大不了的,因为你只需要偶尔做一次,但是你可以很容易地编写一个脚本,它解析package.json并升级你的包。我认为这样更好,因为如果你需要一些特殊的东西,比如保持一个库的当前版本,你可以编辑你的列表。
NPM脚本可以自动更新:
{
"_cmd-update-modules": "npm run devops-update-modules",
"scripts": {
"create-global-node-modules-folder": "if not exist \"%appdata%\\npm\\node_modules\" mkdir %appdata%\\npm\\node_modules",
"npm-i-g": "npm i npm@latest -g",
"npm-check-i-g": "npm i npm-check@latest -g",
"eslint-i-g": "npm i eslint@latest -g",
"npm-check-u-l": "npm-check \"C:\\Program Files\\nodejs\\node_modules\\npm\" -y",
"npm-check-u-g": "npm-check \"C:\\Program Files\\nodejs\\node_modules\\npm\" -y -g",
"npm-deep-update-l": "npm update --depth 9999 --dev",
"npm-deep-update-g": "npm update --depth 9999 --dev -g",
"npm-cache-clear": "npm cache clear --force",
"devops-update-modules": "npm run create-global-node-modules-folder && npm run npm-i-g && npm run npm-check-i-g && npm run eslint-i-g && npm run npm-check-u-l && npm run npm-check-u-g && npm run npm-deep-update-l && npm run npm-deep-update-g && npm run npm-cache-clear"
}
}
有关详细信息和分步手册:https://stackoverflow.com/a/34295664
我觉得90%的答案都是“使用npm检查更新”的变体。以下是我所做的(相关代码):
{
"devDependencies": {
"updates": "^13.0.5" // the version here could be "latest" or "*" tbh...
},
"scripts": {
"test:dependencies": "updates --update ./",
}
}
运行npm运行测试:dependencies(或调用依赖项更新脚本)将检查package.json中列出的每个包的最新版本,并让您知道最新版本的发布时间。在那之后运行npm i,您将获得最新信息!
此外,与npm检查更新不同,更新具有零依赖性(在本文发布时,ncu有29个)。
在@kozlovd答案上展开,我构建了一个bash脚本,通过两个步骤更新任何npm脚本:
如果您收到错误,请手动计算npm包的数量。npm列表|wc-l这里用包的数量替换NUM_PKGS,如果在上一个命令中出现“UNMET DEPENDENCY”错误,则将$2替换为$4。
NUM_PKGS=9999; npm list --no-unicode | awk -v NUM_PKGS=$NUM_PKGS '{\
if (NR>1 && NR <NUM_PKGS) {\
pver=A[split($2,A,"@")];\
print substr($2,0,length($2)-length(pver))"latest";\
}\
}' | xargs -r npm i
说明:命令Nº2首先获取包名,并仅在出现“UNMET DEPENDENCY”错误的情况下对其行进行操作,然后awk迭代每个包名,它获取版本值并用“最新”替换,最后所有替换了版本的包都由xargs收集,xargs在“npm i”之后将它们连接起来,最终用最新版本安装所有包。此步骤可以使用没有设置版本的包或现有项目更新新项目