楼主原来是做服务端和 Android 的,包依赖管理都是 gradle/maven,最近团队需要开始接触前端,但我有个疑问,为啥前端的依赖都是类似 "dependencies": {"vue": "^3.0.11"}
这样写,这样似乎就没有锁定一个具体版本,执行 install 时会自动去 npm 仓库下载最新的版本(同一个大版本内)
感觉大家的解答,懂了一些
lock文件的机制我去详细了解下
我理解这只是一个美好的约定,三方库的作者不一定会遵守这个约定
确实可以解决本地能跑,持续集成/自动化环境不能跑的问题
1
yzw716305797 246 天前
1. 一般不会有 bug ,不一般的时候也挺多
2. 会有坑,偶尔会出现本地和线上不一致的情况 把前面的 ^去掉,版本就会锁死,但是也不是完全没问题了,因为依赖的依赖,也可能会出问题 |
2
clevercats 246 天前
指定版本"^3.0.11" , 这里面不加^就行了
|
3
coldmonkeybit 246 天前
只要 lock 文件是同一份,就不会出现拉取到不同的依赖版本的情况吧
|
4
duanxianze 246 天前
和 gradle/maven,写法差不多啊,^+等正则写法,我映像中包括 python,ruby,php,rust 不都是这样的?直接写数字就是指定了
|
5
unco020511 OP @yzw716305797 去掉可以锁定版本我倒是知道.既然锁定版本会有坑,为啥大家都这样写呢?我遇到好几个项目好像都是加^.不是特别理解,因为在用 maven 时,都是固定版本的
|
6
unco020511 OP @duanxianze 包管理工具应该都有提供类似的机制,但好像大家的习惯(或者说约定)差异很大?比如 Android 开发基本没见过不指定具体版本的情况,前端就很多^这样写,想知道为什么会存在这个差异呢
|
7
sibusana 246 天前
@unco020511 如果项目内有 lock 文件,比如 pnpm-lock.yaml 。如果安装之后 lock 文件没有产生修改,可以认为依赖没有变化
|
8
lingxiaoli 246 天前
同一个大版本不存在 break change 都是兼容的
|
9
ztxcccc 246 天前
lock 文件可以固定版本和下载地址,但是假设说有人用了个私有的地址+偷偷替换掉远程文件,也是有可能的
|
10
xwwsxp 246 天前
@duanxianze 它是通过 npm 的 pageage-json.lock 文件来锁定版本的;只要将这个提交到远程 Git 仓库就可以了,也能得到类似 Maven 的方式;但是,前端毕竟属于娱乐圈,开玩笑,升级比较快,很多前端喜欢最新的东西。
|
11
unco020511 OP @lingxiaoli 这确实是一个「约定」,但也只是一个「约定」
|
12
murmur 246 天前
一般我们是把 node_modules 打包保存,直接发给别人,一劳永逸的解决问题
|
13
laobobo 246 天前
有一个 lock 文件,就是用来锁定的
|
14
NerbraskaGuy 246 天前
package-lock.json 不就是做这个用的么,package.json 里面锁定直接依赖的包版本,但是如果又依赖其他的包的话可能会出问题,尤其是越大型的项目互相依赖越复杂
|
16
wu67 246 天前
"vue": "3.0.11" 只装这个版本, 精确到补丁版本号
"vue": "~3.0.11" 可以装 3.0.* 的最新版本 "vue": "^3.0.11" 可以装 3.* 的最新版本 或者你把 package-lock.json 或者 yarn-lock.json 一起提供. 或者极端一点, 连 node_modules 打包给别人, 但是部分包如果跨平台芯片就没法用了, 例如苹果 m 系列和 window intel... |
17
wu67 246 天前
一般来讲, 经常维护的项目, 用^完全没问题, 出事解决就行. 实在担心就逐步锁定范围.
|
18
wangtian2020 246 天前
凉拌,就算锁了版本,别人开发用的浏览器、系统版本、nodejs 不一样也有可能出问题
我就是喜欢安装新版本,出了问题再改回来,一般不出 |
19
renmu 246 天前 via Android
npm ci 可以使用 lock 文件安装,npm i 是不会的
|
20
dongtingyue 246 天前
好心提醒,使用 volta 之类的管理 node ,npm 版本。要不然还是有坑。前端是大坑。
|
21
unco020511 OP @dongtingyue 我是使用 nvm 来管理 node 版本的,然后每个 node 版本会自带一个 npm 版本,不同项目会指定 node 版本,这样应该就没啥坑吧?
|
22
unco020511 OP @wangtian2020 这样倒是也行
|
23
AoEiuV020JP 246 天前
node 对版本号有规定,少数不合群的也可以特殊处理,多数还是愿意按规矩来,
Java 这边一开始就没管,版本号可以是任意字符串,大家也都是这么做的, 所以一般都是指定特定版本,有特殊需求也有特定语法可以指定比如 gradle 的加号+, |
24
lisongeee 246 天前
你说的这个问题在 pnpm 已经得到解决,pnpm 现在默认安装就是固定版本,然后使用 lock 文件去锁次级依赖
|
25
Wxh16144 246 天前
都说了 Lock 文件我就不补充了,另外看到 package.json 一些符号可能不太熟悉可以试试 https://semver.npmjs.com/ 参考。
|
26
madao199 246 天前
--frozen-lockfile 就能解决了 前提是你要和同事沟通好
|
27
leokun 246 天前
没有 lock 文件的话,无论如何都不可能锁定版本,因为你的直接依赖有自己的依赖,它会自动更新小版本,这是饱受诟病的问题
|
28
jchnxu 246 天前
@yzw716305797 哈哈哈笑死了
|
29
unclebb 246 天前 via iPhone
默认所有包维护者都理解版本规则,这样默认大版本升级可以及时修复 bug 和获取特性更新,然而现实很残酷,只能 lock 或者强行指定版本。
不过如果项目一直迭代问题也不大,有问题也会及时发现,如果是一个陈年项目突然诈尸,那就很惨烈了,别问我怎么知道的。 |
30
rabbbit 246 天前
全部锁版本和全部不锁都可能会踩坑,
最讨厌的是 npm 新添加 package 他也会去更新其他的 package , 个人的解决方案是用户数多的、常用的不锁,很久没更新、版本小于 1.0.0 、用户量小的 package 锁版本。 |
31
Torpedo 246 天前
你一眼就看出来了问题。lock 确实在这个场景缓解了这个问题。
此外还有 nodejs 那个不太靠谱的找 lib 的方式。都被 lock 文件掩盖了 |
32
TsubasaHanekaw 245 天前
我之前直接放在容器里,install 好之后打包整个容器外发
|
33
unco020511 OP @TsubasaHanekaw 这也是个思路
|