我花了很多东西来寻找一种简单的方法来开发 Firefox 扩展,但我无法创建扩展。请告诉我 Firefox 扩展的文件结构和安装扩展的简单方法。
2 回答
.xpi
文件格式(扩展打包)
用作 Mozilla(Firefox、Thunderbird 等)扩展的容器的.xpi
文件只是 zip 存档,文件扩展名已更改为.xpi
使用“deflate”压缩或未压缩添加到存档中的文件。如果您使用除“deflate”或“store”(未压缩)以外的任何其他类型的压缩,您将收到如下错误:
This add-on cannot be installed because it appears to be corrupted
这些文件从 zip 压缩档案的根目录开始(即没有一个空的第一级目录,然后包含这些文件)。
存档的内容可能只是几个文件到任意数量的文件。必须包含的文件取决于您要打包的加载项的类型。如果您计划使用Add-on SDK,那么您可能不需要知道这些文件的格式,因为其中大部分是通过使用该jpm
工具抽象出来的。如果您不知道我在说什么,您可能想了解 Firefox 的不同类型的附加组件(WebExtensions、附加SDK、Bootstrap/Restartless和Overlay/Legacy/XUL)。
网络扩展:
至少,您将拥有一个描述扩展的manifest.json文件。几乎可以肯定,您将拥有其他文件。WebExtension插件中不使用其他类型插件中使用的chrome.manifest、install.rdf和package.json文件。您不应该拥有这些文件。
附加 SDK:
Firefox Add-on SDK 扩展的.xpi文件应该通过执行来创建jpm xpi
。附加 SDK 扩展在package.json文件中描述。当您运行jpm xpi
您的附加组件时,它会被转换为 Bootstrap/Restartless 附加组件。这是通过将package.json文件转换为install.rdf、创建chrome.manifest文件并向 JavaScript 添加一些包装器来完成的。您不应该尝试自己执行此过程,除非您的附加组件需要这样做(这非常罕见)。
Bootstrap/Restartless 和 Overlay/legacy:
至少,您有install.rdf和chrome.manifest文件。Bootstrap/Restartless 附加组件也将有一个bootstrap.js文件。几乎总会有其他文件。这些类型的附加组件不使用package.json,也不使用manifest.json。
我非常简单的 Bootstrap/Restartless 扩展,打印按钮是打印(将打印按钮更改为打印而不是打印预览),具有以下结构:
Archive contains:
bootstrap.js
chrome/
chrome/content/
chrome/content/options.xul
chrome/skin/
chrome/skin/printer-typeC128.png
chrome/skin/printer-typeC32.png
chrome/skin/printer-typeC48.png
chrome/skin/printer-typeC64.png
chrome.manifest
install.rdf
license.txt
Total 12 entries (42360 bytes)
- 有必需的install.rdf和chrome.manifest文件。
- Bootstrap/Restartless扩展需要文件bootstrap.js 。它包含在安装、删除、启用、禁用扩展程序时或在 Firefox 启动或关闭时运行的代码。这个扩展非常简单,所有的 JavaScript 代码都包含在bootstrap.js中。
- 有一个chrome/content/options.xul文件,它是选项对话框的 XUL 定义。
- license.txt只是说明该扩展是在 Mozilla Public License v2.0 下发布的。
- 这些
.png
文件是此扩展在各种分辨率下的图标。
创建.xpi文件
您可以使用任何您想要的方法来创建.zip文件,该文件被重命名为.xpi。请记住,唯一受支持的压缩方法是“放气”,但也可以将文件添加到未压缩的存档中。您的顶级文件(例如,您拥有的manifest.json (WebExtensions) 或其他所有文件:chrome.manifest和install.rdf)应该在存档的根目录中,而不是在子目录中。
为了创建.xpi
文件,我使用了一个批处理文件,它结合了 DOS 和 Unix/Linux(实际上是Cygwin)命令:
mkxpi.bat:
rm -f PrintButtonIsPrint@makyen.foo.xpi
zip -1 -r PrintButtonIsPrint@makyen.foo.xpi * -x@xpi.ignore
pause
.xpi
这将删除该文件的任何旧版本。然后它使用最小压缩创建一个新.xpi
文件-1
(访问速度比节省空间更重要),这强制只存储未压缩或使用“deflate”。新的.xpi将包含所有文件和子目录*
,但忽略xpi.ignore文本文件 ( -x@xpi.ignore
) 中的所有文件。使用忽略文件是因为我在目录中有其他东西(例如.git
目录、.bak
从编辑器自动创建的文件等)。创建文件后,脚本将.xpi
执行pause
,因此我可以验证包含哪些文件,没有错误等,而不是让窗口消失并假设一切正常。
我的xpi.ignore文件有点长,因为它积累了各种项目的垃圾,并且很少被清除:
*.com
*.class
*.dll
*.exe
*.o
*.so
*.7z
*.dmg
*.gz
*.iso
*.jar
*.rar
*.tar
*.zip
*.log
*.sql
*.sqlite
*.svg
*/.DS_Store
*/.DS_Store?
*/._*
._*
*/.Spotlight-V100
.Spotlight-V100
*/.Trashes
.Trashes
*/ehthumbs.db
*/Thumbs.db
*.ORIG
*.bak
*OLD*
OLD/*
*/OLD/*
*.OLD
*.OLD[0-9]
*/OLD/*
*/OLD[0-9]/*
*.unknown
*.unknown[0-9]
*.updated
*.updated[0-9]
*/Copy *
*/OLD
*/OLD*
*/OLD[0-9]
*/OLD[0-9][0-9]
*/test/*
*/not in xpi/*
*/tmp
*.tmp
*/foo
*.foo
*checkpoint
.git
*/.git
.gitignore
*/.gitignore
xpi.ignore
mkclean.bat
mkclean.bat.DONTRUN
mkxpi.bat
*.xpi
*/devtools-toolbox-window.ico
*/devtools-webconsole.ico
*/JSConsoleWindow.ico
*/main-window.ico
*/places.ico
*/viewSource.ico
安装扩展
作为普通扩展:
为了将扩展作为普通附加组件安装到 Firefox 的品牌 Release 或 Beta 版本中,它必须由 Mozilla 签名。这是通过将其提交给 AMO来完成的。您可以通过设置为in将未签名的扩展作为普通插件安装到其他版本的 Firefox(例如Firefox Developer Edition、Firefox Nightly、Unbrand Beta 或 Unbrand Release)中。xpinstall.signatures.required
false
about:config
如果您选择,在特定的 Firefox 安装中,您可以完全禁用附加签名要求。有关更多信息,您可以查看我的回答:如何禁用 Firefox 附加组件的签名检查?
安装扩展(即.xpi
文件)可以很简单,只需将其拖放到运行您希望安装的配置文件的 Firefox 窗口中即可。对于development /testing,您可以使用Firefox 扩展代理文件(<em:id>
在配置文件的extensions目录包含一行,其中包含包含扩展文件的目录的完整路径)。根据您的目标(一个配置文件、所有配置文件、所有用户、哪个操作系统等),关于如何安装扩展程序还有其他选项。
作为临时插件:
唯一不能作为临时插件安装的扩展类型是覆盖/旧版。此类扩展需要在安装后重新启动浏览器才能正常运行。因此,它们不能是暂时的。
要将扩展安装为临时,请导航至about:debugging
。在该页面上,单击加载临时加载项,然后将弹出窗口导航到相应的文件夹并选择.xpi文件或目录中的任何文件。如果您选择.xpi文件以外的文件,则假定该目录包含解压的附加文件,这些文件将被自动识别。
生成签名的 .xpi
- 用 NPM 安装 web-ext,也许你需要 root 权限:
npm install --global web-ext
- 转到https://addons.mozilla.org/es/developers/addon/api/key/并生成一个新的 API KEY。
- 转到您的扩展文件夹,打开终端并执行:
web-ext sign --api-key=$AMO_JWT_ISSUER --api-secret=$AMO_JWT_SECRET
其中 $AMO_JWT_IUSSER 和 $AMO_JWT_SECRET 是您在上一步中生成的密钥。