1.错误

2.原因:构建的命令它的 npm 包版本都依照 pnpm.lock,但是 lock 文件有依赖错误,需要重新生成
这里因为是用的 pnpm install --offline --no-scripts --lockfile-only 这个命令,里面用了 offline 参数
这个命令只会从本地缓存仓库来使用包,不会去网络下载,并且版本都依照 pnpm.lock 来
所以我们由于在本地用的 yarn 命令,而构建的时候要用 pnpm,所以会导致这种错误!!!需要注意!
还有的仓库里面的 dockerfile 用的是:yarn install --prefer-offline --ignore-scripts --frozen-lockfile
我发现本地安装依赖的 yarn 命令用的是 node 20+版本
但是构建时候用的 pnpm 要求的却是 node 18.17 版本

我猜原因可能是我下载了"react-json-view": "^1.21.3",,他可能是在 node20 下下载的,但是依赖的其他包比如 babel/core 在 pnpm 下的版本比较低(因为 pnpm 是 node18),但是这个 babel/core 又在 lock 文件里面被锁死了,就导致依赖安装有问题,所以我们要在本地重新用 pnpm 下载包,更新为新的 lock 文件
3.解决
删除 pnpm-lock.yaml
然后再重新 pnpm install
就会生成新的 lock 文件
4.具体步骤
(1)删除 lock
(2)pnpm i
(3)这时候 lock 文件一定和 test 分支有冲突
(4)本地 merge 把 test 弄过来,然后解决 lock 冲突
(5)然后提交,合并,然后成功构建

5.lock 文件的作用
yarn.lock 和 pnpm-lock.yaml 都是 锁定文件(Lock File),用于确保项目的 依赖一致性,无论在哪个机器上安装依赖,或者不同开发人员在不同环境中工作时,确保每个人安装的依赖版本是相同的。
锁定文件的作用:
- 确保依赖版本一致性:
- 在项目中,
yarn.lock和pnpm-lock.yaml记录了每个依赖包的 确切版本,包括 直接依赖 和 间接依赖(即依赖的依赖)。 - 这样一来,当其他开发人员或 CI/CD 环境在安装依赖时,能够确保安装与原来开发环境中完全相同的版本,而不是按照
package.json中指定的版本范围(如^1.0.0)安装可能不同的版本。
- 在项目中,
- 提升安装速度:
- 锁定文件不仅记录依赖的版本,还可以存储每个包的 源地址、包的哈希值 等元数据,帮助包管理工具(如
pnpm、yarn)更高效地下载依赖。 - 通过缓存和复用锁定文件中的信息,
yarn和pnpm可以避免每次安装时从网络下载所有的包,从而加速安装过程。
- 锁定文件不仅记录依赖的版本,还可以存储每个包的 源地址、包的哈希值 等元数据,帮助包管理工具(如
- 避免潜在的版本冲突:
- 如果没有锁定文件,
package.json中定义的版本范围可能会导致每次安装时解析到不同的依赖版本,尤其是在依赖较多或较复杂的项目中,这可能会导致 版本冲突 或不兼容的情况。 - 锁定文件确保所有团队成员和生产环境中安装的依赖版本完全一致,避免了这类问题。
- 如果没有锁定文件,
- 便于版本升级和回退:
- 锁定文件使得在升级依赖时,能够清楚地看到依赖的变化,并且可以通过版本控制(例如 Git)方便地回退到之前的依赖版本。
6.解释:pnpm install --offline --no-scripts --lockfile-only
pnpm install --offline --no-scripts --lockfile-only 这个命令是使用 pnpm 安装依赖的一个特定用法。我们可以逐个分析这些选项的含义:
命令结构:
pnpm install --offline --no-scripts --lockfile-only各个选项的解析:
**pnpm install**:- 这是
pnpm的安装命令,用来安装项目的依赖。它会根据项目根目录中的package.json和pnpm-lock.yaml文件来解析并安装依赖包。 - 通常,它会:
- 解析
package.json中列出的所有依赖。 - 下载依赖并将它们安装到
node_modules目录中。
- 解析
- 这是
**--offline**:--offline表示启用 离线安装模式,这意味着pnpm在安装依赖时会 只使用本地缓存 中的依赖包,而不会去 网络上 拉取任何新的依赖。- 如果缓存中没有所需的依赖,
pnpm会抛出错误。这是确保安装过程 不依赖网络,完全基于本地存储的依赖包。
注意:离线模式通常用于有缓存的环境(比如 CI/CD 构建环境),或者你之前已经下载过依赖并且不希望再次访问网络。
**--no-scripts**:--no-scripts表示 不执行安装过程中的脚本,比如安装依赖时在package.json中定义的preinstall、install和postinstall等钩子。- 这个选项通常用于 跳过执行自定义的安装脚本,以加快安装过程,或者避免某些脚本在某些环境下执行(例如在 CI 环境中)。
常见用途:
- 禁止执行例如在安装时触发的测试、构建或其他不必要的脚本。
- 在 CI 环境中,安装依赖时不需要执行某些构建或测试脚本,以提高效率。
**--lockfile-only**:--lockfile-only表示 只更新锁文件(**pnpm-lock.yaml**),并 不安装依赖。- 该选项常用于 同步锁定文件,确保
pnpm-lock.yaml文件与package.json中的依赖一致。 - 这对依赖的版本范围、更新和版本锁定是有用的,但并不会重新安装
node_modules中的所有包,适合用于更新和同步pnpm-lock.yaml文件,而不改变node_modules。
常见用途:
- 当你只想 **更新 **`**pnpm-lock.yaml**`** 文件**,而不重新安装依赖时使用。
- 适用于已安装过的依赖,但需要确保锁定文件与当前 `package.json` 文件一致时。
总结:
pnpm install --offline --no-scripts --lockfile-only 这个命令会在以下条件下执行:
- 离线安装:
pnpm会从本地缓存中安装依赖,而不会访问网络。 - 跳过脚本执行:不会运行任何在
package.json中定义的安装脚本。 - 只更新锁文件:只会更新
pnpm-lock.yaml文件,而不实际安装新的依赖。
这个命令通常用于确保锁文件与依赖一致性,或者在 CI/CD 环境中跳过安装过程中的脚本执行,快速同步依赖和锁文件。
