2

我花了很多东西来寻找一种简单的方法来开发 Firefox 扩展,但我无法创建扩展。请告诉我 Firefox 扩展的文件结构和安装扩展的简单方法。

4

2 回答 2

5

.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、附加SDKBootstrap/RestartlessOverlay/Legacy/XUL)。

网络扩展:

至少,您将拥有一个描述扩展的manifest.json文件。几乎可以肯定,您将拥有其他文件。WebExtension插件中不使用其他类型插件中使用的chrome.manifestinstall.rdfpackage.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.rdfchrome.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.rdfchrome.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.manifestinstall.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 EditionFirefox NightlyUnbrand Beta 或 Unbrand Release)中。xpinstall.signatures.requiredfalseabout:config

如果您选择,在特定的 Firefox 安装中,您可以完全禁用附加签名要求。有关更多信息,您可以查看我的回答:如何禁用 Firefox 附加组件的签名检查?

安装扩展(即.xpi文件)可以很简单,只需将其拖放到运行您希望安装的配置文件的 Firefox 窗口中即可。对于development /testing,您可以使用Firefox 扩展代理文件<em:id>在配置文件的extensions目录包含一行,其中包含包含扩展文件的目录的完整路径)。根据您的目标(一个配置文件、所有配置文件、所有用户、哪个操作系统等),关于如何安装扩展程序还有其他选项。

作为临时插件
唯一不能作为临时插件安装的扩展类型是覆盖/旧版。此类扩展需要在安装后重新启动浏览器才能正常运行。因此,它们不能是暂时的。

要将扩展安装为临时,请导航至about:debugging。在该页面上,单击加载临时加载项,然后将弹出窗口导航到相应的文件夹并选择.xpi文件或目录中的任何文件。如果您选择.xpi文件以外的文件,则假定该目录包含解压的附加文件,这些文件将被自动识别。

于 2015-06-25T06:44:06.027 回答
2

生成签名的 .xpi

  1. 用 NPM 安装 web-ext,也许你需要 root 权限:npm install --global web-ext
  2. 转到https://addons.mozilla.org/es/developers/addon/api/key/并生成一个新的 API KEY。
  3. 转到您的扩展文件夹,打开终端并执行:web-ext sign --api-key=$AMO_JWT_ISSUER --api-secret=$AMO_JWT_SECRET其中 $AMO_JWT_IUSSER 和 $AMO_JWT_SECRET 是您在上一步中生成的密钥。
于 2017-08-21T14:01:10.187 回答