使用离线包共享特定npm依赖包

351 阅读3分钟

使用离线包共享特定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 文件后,可以按照以下步骤进行安装:

  1. 解压离线包:将收到的 .tgz 文件解压到一个目录中,例如 offline_packages

  2. 安装离线包:在项目目录中,使用 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~