Firefoxのアドオン開発環境の導入(Add-on SDK編)
少し前のトライアンドエラーの記録です
先に言っておくとcfxはもう古いのでjpm使ったよという内容なのでほんとに必要な人はcfxの代わりにjpmを導入するから読んでください
Firefoxアドオン開発の現状
まずは概要を調べてみる
Firefox 拡張の作り方 (2013 年版) - ひだまりソケットは壊れない
なんとなくしか知らなかったけどこの記事によるとFirefoxのアドオンの作り方は
現状上記の3通り
Add-on SDK というのは昔Jetpackと呼ばれていたやつだ
確かJetpackが出た当初はJetpackで作られたアドオンはまだ実験的な位置づけでリリース版のFirefoxのデフォルト状態では動かなかったのでGreasemonkeyのようにJetpackのランタイムのような公式アドオンを入れる必要があってそれで試した記憶がある
そういえばFirefoxで「拡張機能」を「アドオン」と呼ぶように変わったのはいつ頃だったかな
今回はGreasemonkeyのユーザースクリプトを移植する目的なので迷わず Add-on SDK を選択した
XULとかめどいです
Add-on SDK にはcfxというコマンドラインベースのツールが提供されているのでまずはそれをインストールする
cfxの導入
チュートリアル - Add-on SDK Documentation
- ここを参考にインストール
インストール - Add-on SDK Documentation
- cfx initでアドオンの雛形を作った
cfx 入門 - Add-on SDK Documentation
- main.jsにサンプルコードをコピペした
ツールバーへのボタンの追加 - Add-on SDK Documentation
const widgets = require("widget"); const tabs = require("tabs"); var widget = widgets.Widget({ id: "mozilla-link", label: "Mozilla website", contentURL: "http://www.mozilla.org/favicon.ico", onClick: function() { tabs.open("http://www.mozilla.org/"); } });
- cfx runで起動
まっさらなFirefoxが立ち上がる
しかしチュートリアルにあるアイコンは表示されない
コンソールにはエラーログが出ている
Warning: Use of deprecated require path: In D:\My Documents\firefox\addon-sdk\<アドオン名>\lib\main.js:2: require('tabs'). New path should be: require('sdk/tabs') Warning: Use of deprecated require path: In D:\My Documents\firefox\addon-sdk\<アドオン名>\lib\main.js:1: require('widget'). New path should be: require('sdk/widget') Using binary at 'C:\Program Files (x86)\Mozilla Firefox\firefox.exe'. Using profile at 'c:\users\<ユーザー名>\appdata\local\temp\tmpty8q7g.mozrunner'. console.error: <アドオン名>: Message: Module `sdk/widget` is not found at resource://gre/modules/commonjs/sdk/widget.js Stack: CuddlefishLoader/options<.load@resource://gre/modules/commonjs/sdk/loader/cuddlefish.js:79:18 @resource://jid1-783qkrvmmwuzbg-at-jetpack/<アドオン名>/lib/main.js:1:17 CuddlefishLoader/options<.load@resource://gre/modules/commonjs/sdk/loader/cuddlefish.js:79:18 run@resource://gre/modules/commonjs/sdk/addon/runner.js:145:19 startup/</<@resource://gre/modules/commonjs/sdk/addon/runner.js:86:7 Handler.prototype.process@resource://gre/modules/Promise-backend.js:867:23 this.PromiseWalker.walkerLoop@resource://gre/modules/Promise-backend.js:746:7 this.PromiseWalker.scheduleWalkerLoop/<@resource://gre/modules/Promise-backend.js:688:37 console.error: <アドオン名>: Message: Module `sdk/widget` is not found at resource://gre/modules/commonjs/sdk/widget.js Stack: CuddlefishLoader/options<.load@resource://gre/modules/commonjs/sdk/loader/cuddlefish.js:79:18 @resource://jid1-783qkrvmmwuzbg-at-jetpack/<アドオン名>/lib/main.js:1:17 CuddlefishLoader/options<.load@resource://gre/modules/commonjs/sdk/loader/cuddlefish.js:79:18 run@resource://gre/modules/commonjs/sdk/addon/runner.js:145:19 startup/</<@resource://gre/modules/commonjs/sdk/addon/runner.js:86:7 Handler.prototype.process@resource://gre/modules/Promise-backend.js:867:23 this.PromiseWalker.walkerLoop@resource://gre/modules/Promise-backend.js:746:7 this.PromiseWalker.scheduleWalkerLoop/<@resource://gre/modules/Promise-backend.js:688:37
エラーログは名前が古いと言ってるっぽいので
require('tabs'). を require('sdk/tabs') に
require('widget'). を require('sdk/widget') に
変えてみたけどやっぱりダメっぽい
Using binary at 'C:\Program Files (x86)\Mozilla Firefox\firefox.exe'. Using profile at 'c:\users\<ユーザー名>\appdata\local\temp\tmpdh1unj.mozrunner'. console.error: <アドオン名>: Message: Module `sdk/widget` is not found at resource://gre/modules/commonjs/sdk/widget.js Stack: CuddlefishLoader/options<.load@resource://gre/modules/commonjs/sdk/loader/cuddlefish.js:79:18 @resource://~~-at-jetpack/<アドオン名>/lib/main.js:1:17 CuddlefishLoader/options<.load@resource://gre/modules/commonjs/sdk/loader/cuddlefish.js:79:18 run@resource://gre/modules/commonjs/sdk/addon/runner.js:145:19 startup/</<@resource://gre/modules/commonjs/sdk/addon/runner.js:86:7 Handler.prototype.process@resource://gre/modules/Promise-backend.js:867:23 this.PromiseWalker.walkerLoop@resource://gre/modules/Promise-backend.js:746:7 this.PromiseWalker.scheduleWalkerLoop/<@resource://gre/modules/Promise-backend.js:688:37 console.error: <アドオン名>: Message: Module `sdk/widget` is not found at resource://gre/modules/commonjs/sdk/widget.js Stack: CuddlefishLoader/options<.load@resource://gre/modules/commonjs/sdk/loader/cuddlefish.js:79:18 @resource://~~-at-jetpack/<アドオン名>/lib/main.js:1:17 CuddlefishLoader/options<.load@resource://gre/modules/commonjs/sdk/loader/cuddlefish.js:79:18 run@resource://gre/modules/commonjs/sdk/addon/runner.js:145:19 startup/</<@resource://gre/modules/commonjs/sdk/addon/runner.js:86:7 Handler.prototype.process@resource://gre/modules/Promise-backend.js:867:23 this.PromiseWalker.walkerLoop@resource://gre/modules/Promise-backend.js:746:7 this.PromiseWalker.scheduleWalkerLoop/<@resource://gre/modules/Promise-backend.js:688:37
ライブラリが見つからないらしい
- ここまでやってみてなんかおかしい気がしてもう一度調べなおしてみる
You can use jpm for Firefox 38 and onwards. This article is the reference for jpm.
なんかFx38以降はjpmとかいうのを使えってことらしい
今試したcfxはpythonベースだったがnode.jsベースのものに変わったらしい
cfx has been deprecated, jpm should now be used instead. For more information see JPM replaces CFX for Firefox 38.
cfxはFx38でjpmに置き換わった模様
クソァ!時間返せ!
まあ旧Jetpackだからもう随分出てから経ってるしわからんでもない
それにしてもjpm関係のページがことごとく翻訳されてないので紛らわしい
cfxの代わりにjpmを導入する
- Node.jsをインストールする
からインストーラを落としてインストール。インストール時の設定はデフォルト。
- jpmをインストールする
jpmをインストールするにはNode.jsのパッケージマネージャであるnpmを使用する。
Node.jsにはnpmが含まれているのでNode.jsを入れるとコマンドプロンプトからnpmコマンドが使える状態になっている。
npm install jpm --global
ごちゃごちゃとメッセージが表示されてjpmがインストールされる。
- 新規アドオンのイニシャライズをする
mkdir my-addon cd my-addon jpm init
要は適当にフォルダ作って
jpm init
アドオンに関する情報の入力を求めてくるので適当に入力する。
nameはIDに使用されるものらしいのでちゃんとした名前にしたほうが良さげ。デフォルトはフォルダ名になる。
未入力でエンター押すとデフォルト値になる
cfxでは"main.js"だったがjpmではデフォルトでは"index.js"。
- 実行
jpm run
で実行
- XPI作成
jpm xpi
でパッケージ作成。 特に難しくなかった。 ていうかjpmの方がずっと楽。
とりあえず環境構築までで終わり
実際のAdd-on SDKでの開発はcfxもjpmも大して変わらない
一応書いておくとグリモンのユーザースクリプトからの移植はかなり簡単だった
それについては気が向いたらまた書きます
続き