-
Notifications
You must be signed in to change notification settings - Fork 34
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
请锁定 package.json 里的模块版本号 #52
Comments
不建议锁定,理由见:https://zhuanlan.zhihu.com/p/22934066 |
@afc163 文章说的很有道理,但是一个项目里并不是所有模块都遵循 semver 语义化版本的,或者模块的作者在发布自己的模块的时候并不知道自己引入了一个 bug(即文中所说的“没有经过完善的测试”)。 我自己印象最深的经历就是在我使用 Babel 的时候。以前我在开发划词翻译的时候,几乎每次运行 所以后来我就养成了锁定版本的习惯,但我会频繁使用 |
我个人赞同锁定的方案,有些BUG Fix对你的项目来说,可能是breaking change;有些团队在对于较小的breaking change时,不一定愿意更新大版本号。 |
yarn 的lock也是只锁定一层版本号,对依赖的子依赖无法控制,建议还是用npm官方的shrinkwrap |
@klouskingsley Yarn 并不是仅仅只包含第一层依赖的版本号吧? |
@lmk123 可以看yarn本身的lock,在第二层depedencies中还是使用的semver,没有严格的限定版本。还有假设有第三层依赖的话,yarn也没有列出(未验证)。 |
@klouskingsley yarn.lock 里的第二层的依赖虽然用的是 以
|
@lmk123 是我看得不仔细了,多谢~ |
但是yarn还是有点问题。 {
"name": "yarn0test",
"version": "1.0.0",
"description": "yarn test",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"dependencies": {
"uglify-js": "2.5.0",
"webpack": "^1.14.0",
"webpack-parallel-uglify-plugin": "^0.2.0"
},
"author": "h",
"license": "MIT"
} 没有yarn.lock的时候,执行
通过查看得知, 删除项目node_modules之后在执行 之后也删除node_modules之后试了几次 这就造成了之后使用 |
用过 NPM 的朋友可能都有过下面的经历:
你创建了一个项目,用 npm 安装了一些第三方模块。一个月过去了,另外一个人想跟你一起开发这个项目,但他却无法在他的电脑上正常运行你的项目,尽管在你自己的电脑上一切如常。
你可能已经猜到了,这是因为你自己电脑上的第三方模块和他电脑上的第三方模块的版本不一致导致的。
出现这个问题的过程是这样的:当你第一次安装一个模块的时候,假设它的版本号是
1.0.0
,但在package.json
里 npm 会自动帮你设置一个版本范围:^1.0.0
。一个月过去了,这个模块已经更新到了1.1.0
,但是你从来没有更新过,可是当别人在安装你的项目的时候,npm 会在他的电脑上安装这个版本范围内的最新版本,也就是1.1.0
,这里面可能会包含一些 「Breaking Changes」,所以就导致了在你电脑上好好的项目,在别人的电脑上却跑不起来。即使这个项目只有你一个人开发,你也不应该依赖 npm 自动帮你设置的“版本范围”——一旦你一不小心运行了
npm update
来升级你的第三方依赖,你仍然会遇到上面的问题,更糟糕的是,你根本不知道你升级前用的是哪个版本的第三方模块,你可能不得不去挨个翻看你依赖的模块们有哪些 「Breaking Changes」并逐个更改,等你差不多改完的时候也该下班了,然而跟别人说好今天要完成的功能你还一点都没有开始做。所以,聪明的开发者都会在 package.json 里锁定模块的版本号,以保证在任何情况下大家安装的模块都是一致的。
即使你的项目是用 Yarn 安装模块的,我仍然建议你锁定你的版本号。
在你使用 Yarn 安装模块的时候,这个模块的版本号会被写在
yarn.lock
这个文件里,所以当其他人也使用 Yarn 安装项目里的模块时,Yarn 会优先读取yarn.lock
里的模块版本号以保证大家安装的模块版本是一致的——但如果其他人使用 npm 安装了你项目的模块呢?
跟前文说到的情况一样,用 npm 安装你项目模块的人仍然会安装到最新版本的模块—— npm 并不会从
yarn.lock
文件里读取你所安装的模块的版本,这就又会导致前文提到的问题。即使你在项目的 README.md 里提到了要用 Yarn 安装项目的模块,也无法保证会没人使用 npm 安装模块,因为大家都认为,Yarn 和 npm 是兼容的。所以,无论项目使用的是 npm 还是 Yarn,我都建议锁定模块的版本号,这样一来就可以保证无论大家在何时使用哪种包管理器,所安装的模块都是一致的。
The text was updated successfully, but these errors were encountered: