1. 为什么要导出 Chrome 插件?

常见场景:

  • 备份:防止插件从商店下架后无法再安装。
  • 迁移:换电脑或换浏览器时,快速恢复同一套插件。
  • 离线分发:把插件发给别人,对方无需访问商店即可安装。
  • 二次开发:想基于现有插件改代码,需要先拿到它的文件。

Chrome 插件在商店里分发的格式是 .crx,本质是一个带签名的 ZIP 包。导出插件,就是想办法拿到这个 .crx,或者自己重新打包出一个。


2. 先搞清楚两个关键概念

2.1 插件安装目录 ≠ 插件源码目录

Chrome 把已安装的插件放在一个固定目录里,每个插件用一长串 Extension ID 命名。

macOS 路径:

~/Library/Application Support/Google/Chrome/Default/Extensions/

Windows 路径:

C:\Users\你的用户名\AppData\Local\Google\Chrome\User Data\Default\Extensions

但这个目录是 Chrome 运行时使用的安装目录,不是原始源码目录。它的特点是:

  • 目录名是插件 ID,不是插件名;
  • 里面通常还有一层版本号文件夹(如 8.12.37.1);
  • manifest.json 在版本号文件夹里,不在插件 ID 文件夹里;
  • 商店安装的插件可能被 Chrome 处理过,直接打包不一定能正常用。

所以:“找到插件位置”和“成功导出插件”是两件事。

2.2 .pem 私钥文件的作用

.crx 文件是 签名 过的。签名流程大致如下:

  1. 用私钥对插件内容加密,生成签名;
  2. 把签名和公钥一起塞进 .crx;
  3. Chrome 安装时用公钥验证,确认“这个插件确实来自持有对应私钥的人”。

.pem 文件的作用:

  • 决定 Extension ID:同一个私钥,永远生成同一个 ID;
  • 决定更新权限:发布新版本必须用同一个私钥签名,Chrome 才认为是“升级”而不是“新插件”。

如果丢了 .pem:

  • 仍可打包出 .crx,但会被当成全新插件(新 ID);
  • 已安装旧版本的用户无法自动更新;
  • 如果是离线分发,.pem 就是命根子,务必保存好。

3. 方法一:用 Chrome 自带功能打包(推荐用于自己开发的插件)

3.1 步骤

  1. 打开 Chrome,地址栏输入:

    chrome://extensions/
    
  2. 打开右上角 开发者模式。

  3. 点击左上角 打包扩展程序。

  4. 在弹窗里填写:

    • 扩展程序根目录:选择包含 manifest.json 的那一层文件夹;
    • 私有密钥文件:
      • 第一次打包:留空,Chrome 会自动生成 .pem;
      • 后续更新:选择之前保存的 .pem。
  5. 点击 打包扩展程序,生成 .crx 和 .pem。

3.2 生成位置

.crx 和 .pem 默认生成在 源码文件夹的上一级目录。

3.3 命令行方式(macOS)

Chrome 可执行文件路径:

"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"

打包命令:

"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
  --pack-extension="/Users/你的用户名/项目/我的插件" \
  --pack-extension-key="/Users/你的用户名/项目/我的插件.pem"

第一次打包可省略 --pack-extension-key,Chrome 会自动生成 .pem。

注意:Google Chrome.app 路径里有空格,必须加引号。


4. 方法二:导出已安装的商店插件(推荐用工具)

如果你只是想 备份 / 分享 一个已经装好的商店插件,用 Chrome 自带的“打包扩展程序”经常会报错:

打包扩展程序错误:清单文件缺失或不可读取

原因就是前面说的:你选的目录层级不对,或者该目录里根本没有可读的 manifest.json。

4.1 更可靠的做法:用 CRX 提取工具

Chrome 商店里有一类专门做这件事的插件,比如 CRX Extractor/Downloader。流程通常是:

  1. 安装该工具;
  2. 打开目标插件的商店详情页;
  3. 点击工具按钮,选择下载 .crx;
  4. 保存到本地。

这种方式拿到的 .crx 是商店原始分发包,比从安装目录硬打包靠谱得多。

4.2 如果一定要从安装目录手动找

先确认目录结构:

cd "/Users/huanglian/Library/Application Support/Google/Chrome/Default/Extensions/aeblfdkhhhdcdjpifhhbdiojplfjncoa"
ls

如果看到类似 8.12.37.1 的版本号文件夹,再进去一层:

cd 8.12.37.1
ls

这时应该能看到 manifest.json。把“扩展程序根目录”指到这一层,再尝试打包。

但仍要提醒:从安装目录打包出来的 .crx,可能因为缺少原始签名或代码被处理过而无法正常使用。


5. 常见坑与排查

现象原因解决
cd: string not in pwd: ...路径里有空格,没加引号用引号包住整个路径,或对空格加 \\
“清单文件缺失或不可读取”选到了插件 ID 层,没进到版本号层进入版本号文件夹,确认能看到 manifest.json
打包出的 .crx 装不上从安装目录打包,签名/结构不完整改用 CRX 提取工具,或找原始源码
更新后变成新插件换了 .pem 或丢了原私钥始终使用同一个 .pem
想改代码重新打包安装目录不是源码找到原始源码文件夹再打包

6. 总结

  • 自己开发的插件:用 chrome://extensions/ 的“打包扩展程序”,选含 manifest.json 的目录,第一次留空生成 .pem,之后一直用同一个 .pem。
  • 备份/分享商店插件:优先使用 CRX 提取类工具,别硬从安装目录打包。
  • 找插件位置:~/Library/Application Support/Google/Chrome/Default/Extensions/,每个插件以 ID 命名,里面还有版本号层。
  • .pem 务必保存:它决定插件身份和更新能力,丢了就只能当新插件分发。