Skip to content

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.lockpnpm-lock.yaml 都是 锁定文件(Lock File),用于确保项目的 依赖一致性,无论在哪个机器上安装依赖,或者不同开发人员在不同环境中工作时,确保每个人安装的依赖版本是相同的。

锁定文件的作用:

  1. 确保依赖版本一致性:
    • 在项目中,yarn.lockpnpm-lock.yaml 记录了每个依赖包的 确切版本,包括 直接依赖间接依赖(即依赖的依赖)
    • 这样一来,当其他开发人员或 CI/CD 环境在安装依赖时,能够确保安装与原来开发环境中完全相同的版本,而不是按照 package.json 中指定的版本范围(如 ^1.0.0)安装可能不同的版本。
  2. 提升安装速度:
    • 锁定文件不仅记录依赖的版本,还可以存储每个包的 源地址包的哈希值 等元数据,帮助包管理工具(如 pnpmyarn)更高效地下载依赖。
    • 通过缓存和复用锁定文件中的信息,yarnpnpm 可以避免每次安装时从网络下载所有的包,从而加速安装过程。
  3. 避免潜在的版本冲突:
    • 如果没有锁定文件,package.json 中定义的版本范围可能会导致每次安装时解析到不同的依赖版本,尤其是在依赖较多或较复杂的项目中,这可能会导致 版本冲突 或不兼容的情况。
    • 锁定文件确保所有团队成员和生产环境中安装的依赖版本完全一致,避免了这类问题。
  4. 便于版本升级和回退:
    • 锁定文件使得在升级依赖时,能够清楚地看到依赖的变化,并且可以通过版本控制(例如 Git)方便地回退到之前的依赖版本。

6.解释:pnpm install --offline --no-scripts --lockfile-only

pnpm install --offline --no-scripts --lockfile-only 这个命令是使用 pnpm 安装依赖的一个特定用法。我们可以逐个分析这些选项的含义:

命令结构

bash
pnpm install --offline --no-scripts --lockfile-only

各个选项的解析

  1. **pnpm install**
    • 这是 pnpm 的安装命令,用来安装项目的依赖。它会根据项目根目录中的 package.jsonpnpm-lock.yaml 文件来解析并安装依赖包。
    • 通常,它会:
      • 解析 package.json 中列出的所有依赖。
      • 下载依赖并将它们安装到 node_modules 目录中。
  2. **--offline**
    • --offline 表示启用 离线安装模式,这意味着 pnpm 在安装依赖时会 只使用本地缓存 中的依赖包,而不会去 网络上 拉取任何新的依赖。
    • 如果缓存中没有所需的依赖,pnpm 会抛出错误。这是确保安装过程 不依赖网络,完全基于本地存储的依赖包。

注意:离线模式通常用于有缓存的环境(比如 CI/CD 构建环境),或者你之前已经下载过依赖并且不希望再次访问网络。

  1. **--no-scripts**
    • --no-scripts 表示 不执行安装过程中的脚本,比如安装依赖时在 package.json 中定义的 preinstallinstallpostinstall 等钩子。
    • 这个选项通常用于 跳过执行自定义的安装脚本,以加快安装过程,或者避免某些脚本在某些环境下执行(例如在 CI 环境中)。

常见用途

- 禁止执行例如在安装时触发的测试、构建或其他不必要的脚本。
- 在 CI 环境中,安装依赖时不需要执行某些构建或测试脚本,以提高效率。
  1. **--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 环境中跳过安装过程中的脚本执行,快速同步依赖和锁文件。