V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hello2090
V2EX  ›  Node.js

问个 npm install 的问题

  •  
  •   hello2090 · 2023-11-06 07:58:14 +08:00 · 2430 次点击
    这是一个创建于 412 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Angular 做的不多,问题可能比较简单,大家别笑话。

    创建了一个 NODE 项目以后有了一个 PACKAGE.JSON, 定义了项目的 DEPENDENCY, NPM INSTALL 了之后有了 PACKAGE-LOCK.JSON. 里面是 NPM INSTALL 安装的具体版本。

    那我现在把项目放到 GIT 上,别的 TEAM MEMBER 拿到 CODE, 他们第一次运行,需要保证他们使用/安装的版本和我的一样,是使用NPM INSTALL吗?我在 STACKOVERFLOW 上看到说可以使用NPM CI, 这个命令会检查安装的版本和 PACKAGE-LOCK 里面的版本是一致的。请问是应该使用这个命令吗?谢谢

    19 条回复    2023-11-06 14:26:48 +08:00
    SchneeHertz
        1
    SchneeHertz  
       2023-11-06 08:34:36 +08:00
    npm install 就可以
    sengle
        2
    sengle  
       2023-11-06 08:37:28 +08:00
    是的,使用 npm ci [会用且只会用] package-lock.json 里面的固定的依赖版本进行安装,保证环境一致。( npm install 在存在 lock 文件时是优先使用 lock 中的依赖版本进行安装)
    musi
        3
    musi  
       2023-11-06 08:40:44 +08:00   ❤️ 1
    不懂就问,除了 Angular 这个单词为啥其他的单词都大写
    0xsui
        4
    0xsui  
       2023-11-06 08:47:49 +08:00
    npm 比较慢,建议用 pnpm ,另外,
    npm 依赖版本锁定要保留 package-lock.json;
    pnpm 要保留 pnpm-lock.yaml
    tutou
        5
    tutou  
       2023-11-06 09:16:56 +08:00
    @sengle npm install 的话,就算存在 lock 文件,有时也会升级版本的
    Baymaxbowen
        6
    Baymaxbowen  
       2023-11-06 09:26:16 +08:00
    可以把 package 里面,依赖包的版本号前面的 ^去掉,强制锁定版本
    crysislinux
        7
    crysislinux  
       2023-11-06 09:27:33 +08:00 via Android
    5 楼说的对,要想完全按照 lock 文件装需要用 npm ci
    hello2090
        8
    hello2090  
    OP
       2023-11-06 09:39:46 +08:00 via iPhone
    @musi 哈哈,切换大小写和中文感觉很麻烦,搞糊涂了,后面干脆都大写了
    zqx
        9
    zqx  
       2023-11-06 10:05:12 +08:00 via Android
    6 楼的方法,无法锁定依赖的依赖的版本
    zhhbstudio
        10
    zhhbstudio  
       2023-11-06 10:14:08 +08:00
    npm ci 不会安装 devdependencies [开发依赖] 只会安装 dependencies [运行依赖] 。我理解还是确认好版本号,不使用 ^ ~ 等标记,锁死版本。
    当然实际情况下我都直接 npm i[nstall] 。版本号也不管,实际没出过问题。
    fqy12300
        11
    fqy12300  
       2023-11-06 10:17:52 +08:00
    @tutou npm install package 可以同时修改 package-lock.json 和 package.json ,而不带参数的 npm install 只会修改 package-lock.json
    fqy12300
        12
    fqy12300  
       2023-11-06 10:21:17 +08:00
    @crysislinux npm install 不带参数,是不会升级版本的。
    fqy12300
        13
    fqy12300  
       2023-11-06 10:24:03 +08:00
    @zhhbstudio package-lock.json 已经帮你锁死版本了。
    yzqn
        14
    yzqn  
       2023-11-06 10:26:30 +08:00
    @sengle “npm install 在存在 lock 文件时是优先使用 lock 中的依赖版本进行安装”,请问 lock 文件的作用是什么呢
    IvanLi127
        15
    IvanLi127  
       2023-11-06 10:51:14 +08:00 via Android
    只要附带 lock 文件就行了,对方只要是开发就执行 npm i 。
    zhhbstudio
        16
    zhhbstudio  
       2023-11-06 11:21:39 +08:00
    @fqy12300 #13 我记得比如你的 package.json 中有 a@^1.1.1 ,当你安装后 lock 文件中锁定版本也是这个,当新版本 [email protected] 发布后,npm install 会安装 [email protected] 的。
    我去实际试一下。
    AnkhSpirit
        17
    AnkhSpirit  
       2023-11-06 12:49:57 +08:00
    npm install 时会按照你 package.json 里依赖的版本锁定符号("^" "~" ""),自动升级 package-lock.json 。如果不想自动升级,可以用 npm ci ,ci 会先删除依赖文件夹然后跳过读取 package.json ,直接安装 package-lock.json 里指定的版本

    老实说 nodejs 这块确实有诟病,想固定依赖基本上都得在 package.json 锁定版本,万一有的父依赖的子依赖有安全隐患,后续这个子依赖升级修复了,但是那个父依赖没升级,你想避免隐患的话只能去 package-lock.json 改子依赖的版本,然后一改就只能用 npm ci 安装,因为用 npm i 会自动修正
    AnkhSpirit
        18
    AnkhSpirit  
       2023-11-06 12:55:11 +08:00
    我之前修过一阵子依赖安全问题,经常遇到上述的情况,最后的手段就是手动在 package-lock.json 里锁定各个依赖的版本,然后只要这些父依赖没更新,这个项目就得一直用 npm ci 安装依赖
    zhhbstudio
        19
    zhhbstudio  
       2023-11-06 14:26:48 +08:00
    @fqy12300 #13 #16 好像各个版本不同,最新版本是会锁死的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2717 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 08:18 · PVG 16:18 · LAX 00:18 · JFK 03:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.