PNPM库离线安装方案

以下是几种可行的方案,推荐优先使用方案一


方案一:使用离线镜像(Offline Mirror) - 最优雅、最PNPM的方式

这是 PNPM 官方推荐的处理离线环境的方式。它会在内网电脑上创建一个所有依赖包的压缩文件(tarball)的本地存储库(镜像),然后你可以将这个镜像目录拷贝到外网电脑上使用。

步骤:

  1. 在内网机器上配置和创建离线镜像

    bash 复制代码
    # 1. 在项目根目录或全局配置pnpm,指定离线镜像的路径(例如放在项目下的 .pnpm-store 文件夹)
    pnpm config set store-dir ./.pnpm-store
    # 如果你希望全局使用,可以加 --global 标志
    
    # 2. 告诉pnpm将包文件链接到镜像(重要!)
    pnpm config set package-import-method copy
    
    # 3. 在内网环境下执行安装,此时所有包(包括私有包)的 tarball 都会被下载并拷贝到 ./.pnpm-store 目录中
    pnpm install
  2. 将整个项目文件夹(包括 pnpm-store 目录)拷贝到外网机器

    • 压缩项目目录(包括 node_modules, .pnpm-store, pnpm-lock.yaml 等所有文件)。
    • 通过U盘、移动硬盘或其他方式将压缩包转移到外网电脑。
  3. 在外网机器上配置并使用离线镜像

    bash 复制代码
    # 1. 解压项目
    # 2. 进入项目根目录,配置pnpm使用当前目录下的离线镜像
    pnpm config set store-dir ./.pnpm-store
    pnpm config set package-import-method copy
    
    # 3. 执行安装。此时pnpm不会再尝试从网络下载,而是直接从本地的 .pnpm-store 镜像中提取包文件。
    pnpm install --offline
    # `--offline` 参数强制pnpm不使用网络,只使用本地缓存和镜像。

优点:

  • 官方支持,最符合 PNPM 的设计理念。
  • 不仅解决了私有包问题,而是缓存了所有依赖包,适合完全离线的开发环境。
  • 可靠性高,不会出现文件链接错误。

缺点:

  • 需要额外的磁盘空间来存储压缩包(store-dir)。

方案二:使用 pnpm pack 手动打包私有依赖

如果私有包的数量不多,且你很清楚是哪些包,可以手动将它们打包。

步骤:

  1. 在内网机器上操作

    bash 复制代码
    # 1. 进入私有包所在的目录(或者如果你有多个,需要每个都操作)
    cd path/to/your-private-package
    
    # 2. 使用 pnpm pack 命令打包。
    # 这会在当前目录生成一个 .tgz 文件,例如 your-private-package-1.0.0.tgz
    pnpm pack
    
    # 对每一个无法在外网安装的私有包执行上述操作。
  2. 转移包文件

    • 将生成的 .tgz 文件通过U盘等方式拷贝到外网电脑的项目根目录下(可以创建一个 offline-packages 文件夹来管理)。
  3. 修改外网电脑上的 package.json

    • 将对应私有包的版本号引用改为指向本地文件路径。
    json 复制代码
    {
      "dependencies": {
        // 修改前:
        "your-private-package": "workspace:*", // 或 "1.0.0"
        // 修改后:
        "your-private-package": "file:./offline-packages/your-private-package-1.0.0.tgz"
      }
    }
  4. 在外网电脑上重新安装

    bash 复制代码
    # 执行安装,pnpm会从本地tgz文件安装依赖
    pnpm install

优点:

  • 非常直接,适合依赖数量少的场景。
  • 不需要复杂的配置。

缺点:

  • 手动过程繁琐,如果私有包多或有深层依赖,容易出错。
  • 需要修改 package.json,之后切回网络环境时还需要改回来,不方便。

方案三:整体复制 node_modulesstore 目录(不推荐,易出错)

这是一种"暴力"但往往有效的方法,但需要非常小心。

  1. 在内网机器上

    • 完整安装项目依赖 (pnpm install)。
    • 找到全局的 store 目录,默认位于:
      • Linux: ~/.local/share/pnpm/store
      • Windows: %USERPROFILE%\AppData\Local\pnpm\store
      • macOS: ~/Library/pnpm/store
    • 你也可以通过命令 pnpm store path 快速找到它。
  2. 复制文件

    • 将内网机器上的整个 全局 store 目录 和项目的 node_modules 目录 一起压缩。
  3. 在外网机器上

    • 解压项目文件到正确路径。
    • 将解压后的 store 目录内容覆盖到外网机器的全局 store 目录(路径同上)。
    • 将解压后的 node_modules 目录覆盖到项目下的 node_modules
  4. 验证

    • 在项目根目录运行 pnpm install。PNPM 会检查完整性,如果复制的文件完全正确,它会直接跳过安装,提示所有依赖都已链接。

为什么"不推荐"?

  • 平台相关性 :如果内网和外网的系统不同(如 Windows 和 macOS),Store 中的二进制文件(node-gyp 编译的)可能不兼容。
  • 路径硬链接问题:PNPM 使用了硬链接,直接复制可能会破坏链接关系,导致文件体积巨大或链接失效。
  • 可靠性差:这是一个 Hack,并非官方支持的方式,可能随着 PNPM 版本更新而失效。

总结与建议

方案 适用场景 推荐度
方案一:离线镜像 需要长期、稳定地在无网络环境工作;项目依赖复杂。 ⭐⭐⭐⭐⭐ 最佳
方案二:pnpm pack 只有极少数私有包需要处理;临时、一次性的需求。 ⭐⭐⭐ 简单场景可用
方案三:复制目录 临时应急,并且你清楚自己在做什么。 不推荐,易出错

强烈建议你采用方案一(离线镜像),这是最彻底、最可靠且一劳永逸的方法,特别适合企业级项目的离线部署和开发。

相关推荐
FreeBuf_11 小时前
加密货币武器化:恶意npm包利用以太坊智能合约实现隐蔽通信
前端·npm·智能合约
不知名raver(学python版)1 天前
npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR!
前端·npm·node.js
惜.己1 天前
针对nvm不能导致npm和node生效的解决办法
前端·npm·node.js
fruge3 天前
钉钉机器人消息发送 npm 库:ddmessage-fruge365
机器人·npm·钉钉
艾小码3 天前
只会npm install?这5个隐藏技巧让你效率翻倍!
前端·npm·node.js
缘来小哥5 天前
一文理解npm/yarn/pnpm中的版本通配符
npm·node.js
FreeBuf_5 天前
npm供应链攻击威胁开发环境安全
前端·安全·npm
longze_75 天前
开源npm引导guide组件
前端·javascript·npm·开源·开源软件·guide·引导组件
longze_75 天前
npm 打包上传命令,撤销错误版本
前端·npm·node.js