使用离线包共享特定npm依赖包
有时候,我们需要将项目中的部分依赖包(例如以 @xxx/ 开头的依赖)通过内网安装,而其他依赖包可以通过公共npm registry安装。本文将详细介绍如何提取、打包、发送和安装这些特定的npm依赖包。
1. 提取特定依赖包
首先,我们需要提取出所有以 @xxx/ 开头的依赖包。假设你的 package.json 文件如下:
{
"name": "my-project",
"version": "1.0.0",
"dependencies": {
"@xxx/package1": "^1.0.0",
"@xxx/package2": "^2.0.0",
"lodash": "^4.17.21",
"express": "^4.17.1"
},
"devDependencies": {
"@xxx/dev-package1": "^1.0.0",
"@xxx/dev-package2": "^2.0.0",
"webpack": "^5.0.0",
"babel-loader": "^8.0.0"
}
}
我们需要提取出 @xxx/ 开头的依赖包和开发依赖包。
2. 打包特定依赖包
我们可以使用 npm pack 命令来打包这些特定的依赖包。以下是一个脚本示例,用于自动化这个过程:
#!/bin/bash
# 创建一个临时目录来存放打包文件
mkdir -p temp_packages
# 读取package.json中的dependencies和devDependencies
dependencies=$(jq -r '.dependencies | to_entries[] | select(.key | startswith("@xxx/")) | .key' package.json)
devDependencies=$(jq -r '.devDependencies | to_entries[] | select(.key | startswith("@xxx/")) | .key' package.json)
# 遍历每个依赖包并打包
for package in $dependencies $devDependencies; do
npm pack $package --pack-destination=temp_packages
done
echo "所有 @xxx/ 开头的依赖包已打包并存放在 temp_packages 目录中。"
将上述脚本保存为 pack_xxx_packages.sh,然后运行:
chmod +x pack_xxx_packages.sh
./pack_xxx_packages.sh
这将会在 temp_packages 目录中生成所有 @xxx/ 开头的依赖包的 .tgz 文件。
扫描多个项目的 package.json
如果你有多个项目,并且需要提取这些项目中的内部依赖包,可以使用以下脚本:
#!/bin/bash
# 检查是否提供了根目录参数,如果没有则显示错误信息并退出脚本
if [ -z "$1" ]; then
echo "错误:请提供根目录路径。" >&2
exit 1
fi
# 保存传入的根目录参数到变量 ROOT_DIR 中
ROOT_DIR=$1
# 创建一个临时目录来存放打包文件,如果目录已经存在则不报错
mkdir -p temp_packages || {
echo "警告:无法创建临时目录 temp_packages,可能目录已存在或无权限。" >&2
exit 1
}
# 查找所有包含 package.json 文件的目录,同时排除名为 node_modules 的文件夹
find $ROOT_DIR -path '*/node_modules' -prune -o -name "package.json" -print0 | while IFS= read -r -d '' package_json; do
# 获取当前 package.json 文件所在的项目目录
project_dir=$(dirname "$package_json")
# 读取每个项目的 package.json 中的 dependencies 和 devDependencies
# 只选择以 "@xxx/" 开头的依赖包
dependencies=$(jq -r '.dependencies | to_entries[] | select(.key | startswith("@xxx/")) | .key' "$package_json")
devDependencies=$(jq -r '.devDependencies | to_entries[] | select(.key | startswith("@xxx/")) | .key' "$package_json")
# 遍历每个依赖包并使用 npm pack 命令进行打包
# 打包后的文件将存放到 temp_packages 目录中
for package in $dependencies $devDependencies; do
echo "正在打包:$package"
npm pack $package --pack-destination=temp_packages || {
echo "错误:打包失败,npm pack $package 命令执行出错。" >&2
exit 1
}
done
echo "项目 $project_dir 的依赖包打包完成。"
done
echo "所有项目中的 @xxx/ 开头的依赖包已打包并存放在 temp_packages 目录中。"
exit 0
将上述脚本保存为 pack_multiple_projects.sh,然后运行:
chmod +x pack_multiple_projects.sh
./pack_multiple_projects.sh /path/to/root/directory
在运行脚本时,将 /path/to/root/directory 替换为你的根目录路径。这个脚本会自动查找根目录下所有包含 package.json 文件的子目录,并提取其中的 @xxx/ 开头的依赖包进行打包。
3. 发送离线包
将 temp_packages 目录中的 .tgz 文件发送给外协同学。你可以通过电子邮件、文件共享服务或其他方式发送文件。
4. 外协同学安装离线包
外协同学收到 .tgz 文件后,可以按照以下步骤进行安装:
-
解压离线包:将收到的
.tgz文件解压到一个目录中,例如offline_packages。 -
安装离线包:在项目目录中,使用
npm install命令安装这些离线包。可以通过指定路径的方式来安装:
# 进入项目目录
cd my-project
# 安装离线包
npm install ./offline_packages/@xxx-package1-1.0.0.tgz
npm install ./offline_packages/@xxx-package2-2.0.0.tgz
npm install ./offline_packages/@xxx-dev-package1-1.0.0.tgz
npm install ./offline_packages/@xxx-dev-package2-2.0.0.tgz
如果有很多包需要安装,可以编写一个简单的脚本来自动化这个过程:
#!/bin/bash
# 进入项目目录
cd my-project
# 遍历离线包目录并安装每个包
for package in ../offline_packages/*.tgz; do
npm install $package
done
echo "所有离线包已成功安装。"
将上述脚本保存为 install_offline_packages.sh,然后运行:
chmod +x install_offline_packages.sh
./install_offline_packages.sh
5. 更新 package.json
为了确保项目的 package.json 文件与实际安装的包版本一致,外协同学可以手动更新 package.json 文件中的依赖版本,或者使用 npm install 命令自动更新。
手动更新示例:
{
"dependencies": {
"@xxx/package1": "file:../offline_packages/@xxx-package1-1.0.0.tgz",
"@xxx/package2": "file:../offline_packages/@xxx-package2-2.0.0.tgz"
},
"devDependencies": {
"@xxx/dev-package1": "file:../offline_packages/@xxx-dev-package1-1.0.0.tgz",
"@xxx/dev-package2": "file:../offline_packages/@xxx-dev-package2-2.0.0.tgz"
}
}
6. 最后
通过以上步骤,我们可以轻松地将项目中的特定依赖包提取、打包并发送给外协同学进行离线安装。这样不仅可以确保项目的依赖包版本一致,还能在没有外网的环境中顺利进行开发工作。
希望这篇笔记对你有所帮助!祝你工作顺利,项目进展顺利!😊 Happy coding~