以下是几种可行的方案,推荐优先使用方案一。
方案一:使用离线镜像(Offline Mirror) - 最优雅、最PNPM的方式
这是 PNPM 官方推荐的处理离线环境的方式。它会在内网电脑上创建一个所有依赖包的压缩文件(tarball
)的本地存储库(镜像),然后你可以将这个镜像目录拷贝到外网电脑上使用。
步骤:
-
在内网机器上配置和创建离线镜像
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
-
将整个项目文件夹(包括
pnpm-store
目录)拷贝到外网机器- 压缩项目目录(包括
node_modules
,.pnpm-store
,pnpm-lock.yaml
等所有文件)。 - 通过U盘、移动硬盘或其他方式将压缩包转移到外网电脑。
- 压缩项目目录(包括
-
在外网机器上配置并使用离线镜像
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
手动打包私有依赖
如果私有包的数量不多,且你很清楚是哪些包,可以手动将它们打包。
步骤:
-
在内网机器上操作
bash# 1. 进入私有包所在的目录(或者如果你有多个,需要每个都操作) cd path/to/your-private-package # 2. 使用 pnpm pack 命令打包。 # 这会在当前目录生成一个 .tgz 文件,例如 your-private-package-1.0.0.tgz pnpm pack # 对每一个无法在外网安装的私有包执行上述操作。
-
转移包文件
- 将生成的
.tgz
文件通过U盘等方式拷贝到外网电脑的项目根目录下(可以创建一个offline-packages
文件夹来管理)。
- 将生成的
-
修改外网电脑上的
package.json
- 将对应私有包的版本号引用改为指向本地文件路径。
json{ "dependencies": { // 修改前: "your-private-package": "workspace:*", // 或 "1.0.0" // 修改后: "your-private-package": "file:./offline-packages/your-private-package-1.0.0.tgz" } }
-
在外网电脑上重新安装
bash# 执行安装,pnpm会从本地tgz文件安装依赖 pnpm install
优点:
- 非常直接,适合依赖数量少的场景。
- 不需要复杂的配置。
缺点:
- 手动过程繁琐,如果私有包多或有深层依赖,容易出错。
- 需要修改
package.json
,之后切回网络环境时还需要改回来,不方便。
方案三:整体复制 node_modules
和 store
目录(不推荐,易出错)
这是一种"暴力"但往往有效的方法,但需要非常小心。
-
在内网机器上:
- 完整安装项目依赖 (
pnpm install
)。 - 找到全局的
store
目录,默认位于:- Linux:
~/.local/share/pnpm/store
- Windows:
%USERPROFILE%\AppData\Local\pnpm\store
- macOS:
~/Library/pnpm/store
- Linux:
- 你也可以通过命令
pnpm store path
快速找到它。
- 完整安装项目依赖 (
-
复制文件:
- 将内网机器上的整个 全局
store
目录 和项目的node_modules
目录 一起压缩。
- 将内网机器上的整个 全局
-
在外网机器上:
- 解压项目文件到正确路径。
- 将解压后的
store
目录内容覆盖到外网机器的全局store
目录(路径同上)。 - 将解压后的
node_modules
目录覆盖到项目下的node_modules
。
-
验证:
- 在项目根目录运行
pnpm install
。PNPM 会检查完整性,如果复制的文件完全正确,它会直接跳过安装,提示所有依赖都已链接。
- 在项目根目录运行
为什么"不推荐"?
- 平台相关性 :如果内网和外网的系统不同(如 Windows 和 macOS),Store 中的二进制文件(
node-gyp
编译的)可能不兼容。 - 路径硬链接问题:PNPM 使用了硬链接,直接复制可能会破坏链接关系,导致文件体积巨大或链接失效。
- 可靠性差:这是一个 Hack,并非官方支持的方式,可能随着 PNPM 版本更新而失效。
总结与建议
方案 | 适用场景 | 推荐度 |
---|---|---|
方案一:离线镜像 | 需要长期、稳定地在无网络环境工作;项目依赖复杂。 | ⭐⭐⭐⭐⭐ 最佳 |
方案二:pnpm pack | 只有极少数私有包需要处理;临时、一次性的需求。 | ⭐⭐⭐ 简单场景可用 |
方案三:复制目录 | 临时应急,并且你清楚自己在做什么。 | ⭐ 不推荐,易出错 |
强烈建议你采用方案一(离线镜像),这是最彻底、最可靠且一劳永逸的方法,特别适合企业级项目的离线部署和开发。