Estructura del archivo .xpi de extensión de Firefox: descripción, contenido, creación e instalación

Puse un montón de cosas en la búsqueda de una manera fácil de desarrollar una extensión de Firefox, pero no puedo crear una extensión. Amablemente dígame la estructura de archivos de las extensiones de Firefox y una manera fácil de instalar la extensión.

.xpi archivo .xpi ( .xpi extensión )

Los archivos .xpi que se usan como contenedores para las extensiones de Mozilla (Firefox, Thunderbird, etc.) son simplemente archivos comprimidos que han tenido la extensión de archivo modificada a .xpi con los archivos agregados al archivo utilizando la compresión “desinflar” o sin comprimir. . Si usa cualquier otro tipo de compresión, que no sea “desinflar” o “almacenar” (sin comprimir), obtendrá un error como:

 This add-on cannot be installed because it appears to be corrupted 

Los archivos comienzan en el directorio raíz del archivo zip comprimido (es decir, no hay un directorio de primer nivel vacío que contenga los archivos).

Los contenidos del archivo pueden ser solo unos pocos archivos para cualquier cantidad de archivos. Los archivos que deben incluirse dependen del tipo de complemento que está empaquetando. Si planea usar Add-on SDK , probablemente no necesite conocer el formato de estos archivos, ya que gran parte de este se abstrae mediante la herramienta jpm . Si no tiene idea de lo que estoy hablando, puede leer los diferentes tipos de complementos para Firefox ( WebExtensions , Add-on SDK , Bootstrap / Restartless y Overlay / Legacy / XUL ).

WebExtensions:

Como mínimo, tendrá un archivo manifest.json que describe la extensión. Es casi seguro que tenga archivos adicionales. Los archivos chrome.manifest , install.rdf y package.json utilizados en otros tipos de complementos no se utilizan en los complementos de WebExtension. No deberías tener esos archivos.

Add-on SDK:

El archivo .xpi para una extensión de SDK de Complemento de Firefox se debe crear ejecutando jpm xpi . Las extensiones Add-on SDK se describen en un archivo package.json . Cuando ejecuta jpm xpi su complemento se traduce en un complemento Bootstrap / Restartless. Esto se hace traduciendo el archivo package.json a un install.rdf , creando un archivo chrome.manifest y agregando algunos wrappers al JavaScript. No debe intentar realizar este proceso usted mismo, a menos que sea necesario para que su complemento funcione (lo cual sería bastante raro).

Bootstrap / Restartless y Overlay / legacy:

Como mínimo, tiene los archivos install.rdf y chrome.manifest . Los complementos Bootstrap / Restartless también tendrán un archivo bootstrap.js . Casi siempre habrá archivos adicionales. Estos tipos de complementos no usan un paquete.json , ni un manifest.json .

Mi muy simple extensión Bootstrap / Restartless, el botón Imprimir es Imprimir (cambia el botón de impresión para imprimir en lugar de la vista previa de impresión), tiene la siguiente estructura:

 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) 
  • Existen los archivos requeridos install.rdf y chrome.manifest .
  • El archivo bootstrap.js es necesario para las extensiones Bootstrap / Restartless . Contiene el código que se ejecuta cuando la extensión se instala, elimina, habilita, deshabilita o cuando Firefox se inicia o se apaga. Esta extensión es lo suficientemente simple como para que todo el código JavaScript esté en bootstrap.js .
  • Hay un archivo chrome / content / options.xul que es una definición XUL del diálogo de opciones .
  • License.txt solo explica que la extensión fue revisada bajo la Licencia Pública de Mozilla, v2.0 .
  • Los archivos .png son el icono de esta extensión en varias resoluciones.

Creando el archivo .xpi

Puede usar cualquier método que desee para crear el archivo .zip , que se renombra a .xpi . Tenga en cuenta el requisito de que el único método de compresión admitido es “desinflar”, pero los archivos también se pueden agregar al archivo sin comprimir. Sus archivos de nivel superior (por ejemplo, cualquiera que sea el que tenga de manifest.json (WebExtensions), o todo lo demás: chrome.manifest e install.rdf ) deberían estar en el directorio raíz del archivo, no en un subdirectorio.

Para crear el archivo .xpi , utilizo un archivo por lotes, que utiliza una combinación de comandos DOS y Unix / Linux (en realidad, Cygwin ):

mkxpi.bat :

 rm -f PrintButtonIsPrint@makyen.foo.xpi zip -1 -r PrintButtonIsPrint@makyen.foo.xpi * -x@xpi.ignore pause 

Esto elimina cualquier versión anterior del archivo .xpi . Luego crea un nuevo archivo .xpi usando, -1 , compresión mínima (la velocidad de acceso es más importante que el ahorro de espacio), lo que obliga a almacenar sin comprimir o al usar “desinflar”. El nuevo .xpi contendrá todos los archivos y subdirectorios * , pero ignorará todos los archivos del archivo de texto -x@xpi.ignore ( -x@xpi.ignore ). Ignorar archivos se usa porque tengo otras cosas en el directorio (por ejemplo, el directorio .git , los archivos .bak creados automáticamente desde el editor, etc.). Una vez que se crea el archivo .xpi el script ejecuta una pause para que pueda verificar qué archivos se incluyeron, que no hubo errores, etc., en lugar de simplemente hacer desaparecer la ventana y asumir que todo está bien.

Mi archivo xpi.ignore es un poco largo, ya que acumula rests de varios proyectos y rara vez se limpia:

 *.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 

Instalación de extensiones

Como extensiones normales:
Para instalar una extensión como un complemento normal en una versión de lanzamiento o versión Beta de Firefox, debe estar firmada por Mozilla . Esto se hace enviándolo a AMO . Puede instalar extensiones sin firmar como complementos normales en otras versiones de Firefox (por ejemplo, Firefox Developer Edition , Firefox Nightly , versión beta sin marca o versión sin marca ) estableciendo xpinstall.signatures.required en false en about:config .

Si elige, en una instalación particular de Firefox, puede deshabilitar completamente el requisito de inicio de complemento. Para obtener más información, puede ver mi respuesta: ¿Cómo puedo desactivar la comprobación de firmas para los complementos de Firefox?

Instalar una extensión (es decir, el archivo .xpi ) puede ser una simple cuestión de arrastrar y soltarlo en una ventana de Firefox que ejecuta el perfil en el que desea instalarlo. Para desarrollo / prueba , puede hacer que la extensión esté en un directorio en su unidad local utilizando un archivo proxy de extensión de Firefox (cree un archivo llamado la extensión (en install.rdf para Bootstrap / Restartless y Overlay / Legacy) en el directorio de extensiones del perfil que contiene una línea con la ruta completa al directorio que contiene los archivos de la extensión. Dependiendo de cuál sea su objective (un perfil, todos los perfiles, todos los usuarios, qué SO, etc.), hay otras opciones sobre cómo instalar extensiones .

Como complementos temporales :
El único tipo de extensión que no se puede instalar como complemento temporal es Superposición / Legado. Dichas extensiones requieren que el navegador se reinicie después de la instalación antes de ser funcional. Como tal, no pueden ser temporales.

Para instalar una extensión como temporal, vaya a about:debugging . Desde esa página, haga clic en Cargar complemento temporal, luego navegue por la ventana emergente y seleccione un archivo .xpi o cualquier archivo en el directorio. Si selecciona un archivo que no sea un archivo .xpi , se supone que el directorio contiene archivos agregados desempaquetados que se identificarán automáticamente.

Generar un .xpi firmado

  1. Instale web-ext con NPM, tal vez necesite privilegios de npm install --global web-ext : npm install --global web-ext
  2. Vaya a https://addons.mozilla.org/es/developers/addon/api/key/ y genere una nueva API KEY.
  3. Vaya a su carpeta de extensión, abra una terminal y ejecute: web-ext sign --api-key=$AMO_JWT_ISSUER --api-secret=$AMO_JWT_SECRET donde $ AMO_JWT_IUSSER y $ AMO_JWT_SECRET son las claves que generó en el paso anterior.