npm 仓库私有包离线化安装方案

目录
[隐藏]

在某个前端项目中,存在对内网私有仓库维护和发布的 npm 包依赖。
现在该项目需转移至无法访问私有仓库环境的外部云平台上,进行持续集成构建和部署,会发生私有包无法下载而失败的问题。

下面基于当前主流的包管理器 npm、yarn 和 pnpm 分别探讨可用的解决方案。其中私有仓库 scope 以 @lzwme 作为示例。

1 使用 npm 的私有包离线化安装方案

npm 支持以 file: 协议的方式直接依赖本地 tgz 压缩文件,故可将私有包直接下载下来。但是还存在私有包继续依赖其他私有包的问题,仍可能导致最终安装失败。npm-package-privatify 这个工具包即基于该方案实现,它可以离线所有直接和间接依赖的私有包。下面介绍基于 npm-package-privatify 方案实现的具体方法。

1.1、 执行如下命令:

npx npm-package-privatify scope @lzwme/*

执行成功后,将会在当前目录下生成 private 目录,其包含了离线化的 @lzwme 私有仓库资源。同时,会修改 package.json@lzwme/ 相关依赖的版本为本地 private 目录下的文件路径。

1.2、 复制 private 目录到具体的项目目录中,同时参考 package.json 中的变更修改 @lzwme 相关库的版本为本地文件路径。

1.3、在目标项目中执行 npm install 即可。

1.4、 完成后执行 git reset --hard 命令,还原对 package.json 文件的修改。

注意:private 目录内容较大,建议不要将其在目标项目中纳入 git 版本管理,以避免影响其项目纯净度。可使用独立的仓库或在 ftp 服务器等处维护,在构建时实时下载下来。

2 使用 yarn 的私有包离线化安装方案

由于 yarn 对于使用 file 协议版本路径的包基本会 install 失败,故不能采用与 npm 一致的方案。这里采用 yarn offline 方案,具体步骤参考如下:

2.1、 在项目的 .yarnrc 文件中设置 offline 路径。示例:

yarn-offline-mirror "./npm-pacakges-offline-cache"
yarn-offline-mirror-pruning true

.gitignore 文件中设置忽略规则:

/npm-packages-offline-cache/*.tgz
!npm-packages-offline-cache/@lzwme-*.tgz

2.2、执行如下命令:

yarn install --ignore-optional

执行成功后,会在目录 npm-pacakges-offline-cache 下生成离线的 .tgz 文件。

2.3、在目标仓库的构建过程中,复制 npm-pacakges-offline-cache 目录到目标项目目录中,然后执行 yarn install 即可。

注意: 建议不要将 npm-pacakges-offline-cache 目录在目标项目中纳入 git 版本管理,以避免影响其项目纯净度。可使用独立的仓库或在 ftp 服务器等处维护,在构建时实时下载下来。

3 使用 pnpm 的私有包离线化安装方案

在目标仓库的 .npmrc 文件中增加配置:

prefer-offline=true
store-dir="./pnpm-store"

在目标仓库的 .gitignore 文件中增加 /pnpm-store 以忽略该目录。

在本项目中执行命令: pnpm install --prod

压缩本项目下生成的目录 pnpm-storepnpm-store.zip

在目标仓库的构建过程中,解压 pnpm-store.zip 文件至目标仓库根目录下,然后执行 pnpm install 即可。

4 更简单的方案:压缩与复制解压私有包

上面的方案都是基于包管理工具的 cache 和 offline 能力。实际上从 npm 包依赖查找默认是基于 node_modules 目录的,所以可以直接从安装好的目录中将私有包复制出来,放到目标项目中的 node_modules 中即可。

tar -zcvf static/lzwme.tar.gz node_modules/@lzwme

如果 lzwme.tar.gz 文件并不大,可以直接放到目标项目当中,然后在 package.json 中写一个 postinstall 脚本。示例:

{
"scripts": {
"gzip": "tar -zcvf static/lzwme.tar.gz node_modules/@lzwme",
"postinstall": "tar -zxf static/lzwme.tar.gz"
}
}

注:

windows 系统下可以通过 scoop 安装 tar 工具:

scoop install tar

若希望了解 scoop 工具的安装与使用,可以参考这篇文章:Windows 命令行包管理工具 Scoop 的安装、使用与软件源定制

点赞 (0)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Captcha Code