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