在某个前端项目中,存在对内网私有仓库维护和发布的 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-store
为 pnpm-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 的安装、使用与软件源定制