命令行打包Chrome插件

本文介绍了如何打包、托管和更新通用 Web 服务器中的 crx 文件。

1. 制作.crx 扩展程序安装包

1.1. 手动制作.crx

在 Chrome 浏览器输入框中输入 chrome://extensions/打开扩展程序管理界面,或点击 Chrome 菜单,将光标悬停在“更多工具”上,然后选择“扩展程序”。

在“扩展程序管理”页面上,点击开发者模式旁边的切换开关来启用开发者模式。然后选择打包扩展程序按钮。

在“扩展程序根目录”字段中指定扩展程序文件夹的路径,然后点击打包扩展程序按钮。对于首次打包扩展程序,请忽略 Private key 字段。

Chrome 将创建两个文件:一个 .crx 文件和一个包含扩展程序私钥的 .pem 文件。

切勿丢失私钥!请将 .pem 文件保存在安全可靠的地方;更新扩展程序时需要用到此文件。

1.1.1. 更新.crx 扩展程序安装包

通过增加 manifest.json 中的版本号来更新扩展程序的 .crx 文件。

1
2
3
4
5
6
7
8

{
...
"version": "1.5",
...
}
}

返回扩展程序管理界面,然后点击打包扩展程序按钮。指定扩展程序目录的路径以及私钥的位置。

点击打包扩展程序按钮生产新的.crx 文件。

1.2. 通过命令行打包

通过调用 chrome.exe 在命令行中打包扩展程序。使用 –pack-extension 标志可指定扩展程序的文件夹位置,使用 –pack-extension-key 标志可指定扩展程序私钥文件的位置。

1
2
3
4
5
6
7
8
# For windows
chrome.exe --pack-extension=C:\myext --pack-extension-key=C:\myext.pem

# For fedora
google-chrome --pack-extension=path_to_your_chrome_plugin_source -pack-extension-key=path_to_your_chrome_extension_key
# 例如
google-chrome --pack-extension=~/sourceRepo/chrome_plugin -pack-extension-key=~/sourceRepo/chrome_plugin.pem

2. 托管

托管 .crx 文件的服务器必须使用适当的 HTTP 标头,以便用户通过点击链接来安装扩展程序。

如果满足以下任一条件,Google Chrome 就会将文件视为可安装:

  • 该文件的内容类型为 application/x-chrome-extension
  • 文件后缀为 .crx,并且满足以下两个条件:
    • 文件不会使用 HTTP 标头 X-Content-Type-Options: nosniff 提供
    • 文件包含以下内容之一:
    • 空字符串
    • “text/plain”
    • “application/octet-stream”
    • “unknown/unknown”
    • “application/unknown”
    • /

无法识别可安装文件的最常见原因是服务器发送了标头 X-Content-Type-Options: nosniff。
第二个最常见的原因是服务器发送的内容类型未知,即不在上一个列表中。
如需解决 HTTP 标头问题,请更改服务器的配置或尝试在其他服务器上托管 .crx 文件。

2.1. 更新

浏览器每隔几小时就会检查已安装的扩展程序,看是否有更新网址。对于每个扩展程序,它会向更新网址发出请求,以查找更新清单 XML 文件。

更新检查返回的内容是一个 XML 格式的更新清单,其中列出了相应扩展程序的最新版本。

如果更新清单中的版本高于安装的版本,浏览器就会下载并安装新版本。

新版本的.crx 扩展程序必须使用与当前已安装的版本相同的私钥签名。

注意:为了保护用户隐私,Google Chrome 不会在自动更新清单请求中发送任何 Cookie 标头,并且会忽略对这些请求的响应中的所有 Set-Cookie 标头。

2.1.1. 更新网址

在 Chrome 应用商店以外的服务器上托管的扩展程序必须在其 manifest.json 文件中包含 update_url 字段。

Linux 是唯一一个可供 Chrome 用户安装非 Chrome 应用商店托管的扩展程序的平台。

1
2
3
4
5
6
7
8

{
"name": "My extension",
...
"update_url": "https://myhost.com/mytestextension/updates.xml",
...
}

2.1.2. 更新清单

服务器返回的更新清单应为 XML 文档。

1
2
3
4
5
6
<?xml version='1.0' encoding='UTF-8'?>
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
<app appid='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'>
<updatecheck codebase='https://myhost.com/mytestextension/mte_v2.crx' version='2.0' />
</app>
</gupdate>

该 XML 格式借鉴了 Google 的更新基础架构 Omaha 所使用的格式。扩展程序系统会为更新清单的 <app><updatecheck> 元素使用以下属性:

  • appid: 扩展程序 ID 根据公钥的哈希值生成,如打包中所述。扩展程序的 ID 会显示在“扩展程序管理”页面上
  • 代码库: 指向 .crx 文件的 HTTPS 网址。
  • 版本: 由客户端用于确定是否应下载 codebase 指定的 .crx 文件。它应与 .crx 文件的 manifest.json 文件中“version”的值一致。

更新清单可能会通过添加多个元素来包含有关多个扩展程序的信息。

3. troubleshooting

问题 1: 当点击.crx 文件下载按钮时,报错”程序包无效:CRX_REQUIRED_PROOF_MISSING“

https://support.google.com/chrome/thread/7757612/what-does-crx-required-proof-missing-mean-when-trying-to-install-a-chrome-extension?hl=en

4. 参考文档

在只有命令行界面的服务器上打包 Chrome 扩展

在 Linux 上安装扩展程序

crx is a utility to package Google Chrome extensions via a Node API

Webpack Plugin for a chrome extension build