PrsPrsBK’s blog

Princess Princess Burn Knuckle

Firefox アドオン開発を web-ext へ移行する:初歩2 (web-ext run 小ネタ)

web-ext run できるようになった、一応

[概要] 前回の続き。web-ext run が思ったようにならなかった。ちょっと困ったことを解消したのでそれを書く。あとは環境変数にオプション指定して動作確認、したところ困難が発生した。環境変数でやるのは止してコマンドラインでオプション指定して次に進む。リファレンスはこれ

--firefox-profile は絶対パスにした

プロファイル指定は名前 (firefox.exe -p で起動してプロファイル選ぶ時の「default」など)か、プロファイルフォルダへの絶対パスということになっている。名前で指定すると、プロファイルがよくあるフォルダ、例えば C:/Users/some_user/AppData/Roaming/Mozilla/Firefox/Profiles/alphnum8.name である場合はうまく行くのだが、別のフォルダ (C:\testprofile とか D:\foo\Profiles\alphnum8.name とか) に置いてあるときはそのプロファイルで起動されなかった。絶対パスならば問題ない。--firefox-profile="D:\path\to\Profiles\alphnum8.name" のようにした。パッと見てイシューにないけどこれ報告したらいいのか?

追記 報告しました #1074

有効でない既存のアドオンを消した

何と書けば正確になるか分からないが、「インストールされたアドオン一覧」で赤文字で「このアドオンはダメです」のように表示されて無効になっているものがあると、プロファイル指定して起動まではできるが、すぐ終了する、かもしれない。実際はアドオンなり Firefox なりの自動更新が関係していた可能性があるが、「ダメです」のアドオン (全部そうだったのだが) を削除したら即座終了は発生しなかった。何年か前に作って放置していたプロファイルで試したらこうなった。

--keep-profile-changes (とりあえず不要)

プロファイルへの変更を保存したい場合は web-ext run --keep-profile-changes --firefox-profile=your-custom-profile らしいが、--keep-profile-changes は デフォルトプロファイルに対してはバグのため現在禁止されているらしく、実行時にメッセージで教えてくれる。危険を知らせてくれて良かった、という感想。

>web-ext run --firefox="C:\path\to\firefox.exe" --firefox-profile="C:\path\to\Profiles\alphnum8.default_marked_user" --keep-profile-changes
Running web extension from c:\path\to\webextensions-examples\beastify
run: UsageError: Cannot use --keep-profile-changes on a default profile ("C:\path\to\Profiles\alphnum8.default_marked_user") because web-ext will make it insecure and unsuitable for daily use.
See https://github.com/mozilla/web-ext/issues/1005

「デフォルト」指定されていなければ --keep-profile-changes できる。「では (普段使っているプロファイルでも何でも) デフォルト指定しなければいいのか? 壊れないのか?」という疑問もあったが、とりあえずは使わないので気にしないことにした。このオプションがない場合、web-ext run ではプロファイルがコピーされるようで、それで足りる。例えば twitter であれば通常の起動をしてログインしておけば、このオプションなしでもそのままログイン状態でいられる。

あとこのオプションなしなら、プロファイルのサイズが大きいとコピーに時間がかかる。普段使ってるものだと嫌になるので、結局新規に開発用のプロファイル作った方が良いと思った。

オプションを環境変数で指定したかった

むずかしい。全然うまくいかない。web-ext build --ignore-files *.bat hoge.txtコマンドラインで指定すれば動くけど環境変数 WEB_EXT_IGNORE_FILES になると狙い通りにならない。まあそれはいいんだけど次が辛い。

web-ext run --firefox="C:\path\to\firefox.exe" が動作して、WEB_EXT_FIREFOX に同じパスを指定してもうまくいく。この状態で web-ext build するとオプションの説明とともに「Unknown argument: firefox」と表示される。大変厳しい。WEB_EXT_FIREFOX_PROFILE も使うと更に web-ext run がすっきりするが、web-ext build の「Unknown argument」が増える。

github のプロジェクトを確認すると Environment variables get applied as options to any command #793 ということなので、全コマンド共通のオプション以外は使えない。環境変数自体を保留にした。よく見たら別のライブラリのイシューになっているがどうなるのだろう。

※2017-09-09 追記 無視してほしいファイルの件はイシューがあった

Firefox アドオン開発を web-ext へ移行する:初歩(開発工程の話)

要約

開発工程の話。自分は移行できるっぽい。やらせたい動作を WebExtensions でどのようにやるかは一切書いていない。後で調べる。文中の API キー等秘密の情報は消してある。具体的なポイントは 5 つあった(1 つは途中まで)。

概要

背景と目的

1. Firefox アドオンは WebExtensions ベースに限定される (2017 年 11 月の 57 から切り替わる)。

2. WebExtensions ベースで作っていないので、web-ext という新ツールでやり直すか、もうやめるかどちらかになる。

3. [目的] やめるかどうか決める。

4. [目標] とりあえずこれまでの「変更→パッケージ作成→公開せずに Extension Auto-Installer (これも 11 月で無効になるけど) でインストール」のようなことができるか確認する。

5. [結果] 目標の 75% 程度。アドオン変更→web-ext run で動作確認→webext build でパッケージ (zip) 作成→web-ext sign で署名 (xpi 作成)→インストール、という流れになる (署名は頻繁にやることではないと思うので web-ext run が必要になる)。web-ext run でやる部分を確認するところで滞ったので、続きはまた後でやる。

状況

1. 自分専用で非公開のアドオンを使っている。cfx (Add-on SDK) で作成。jpm には面倒くさがって移行しなかった。web-ext に移行する必要がある。

2. 署名つきにしていない。だるかった。具体的に何するのか把握する必要がある。

3. [環境] Windows10、Firefox Developer Edition (ver. 54、更新すると自作アドオンをインストールできなくなる以前にブックマークが表示されないなどあったので残してある)。Vim で書いていた。

やったこと

情報収集、整理

アドオンには署名必須のはずだが、web-ext の Getting startedSigning and Distributing your Add-on (日本語) 等を読むと、アドオンには署名もしくは ID (正確には manifest.json の applications.gecko.id キー) が必要と読める。ID 取得には一度署名が必要だし ID を管理しないでやっていこう (あと Google Chrome だと良くない) と言っているし、何より実際は ID だけではインストールできていない (まあ一応確認した) ので署名をつける。署名は AMO にアップロードすれば済むが、web-ext sign 経由で署名つければ毎回アドオンページにアップロードしなくて済む、web-ext sign には JWT issuer/key が必要、それらは多分 Firefox アカウントがあれば (あるいは何かアップロードしてやれば) 良い、と見当がついた。

なので以下の手順は 1. Firefox アカウント作って 2. JWT issuer と JWT key とを取得し、3. web-ext sign で署名して 4. インストール、になる。※これは 3 確認の段階で修正されて web-ext run が導入される。

web-ext は Getting started を見てインストールした。更新は npm のドキュメントが node_modules/npm のどこかにあったので参照して、npm update -g web-ext でやれた。ver. 2.0.0。

1. Firefox アカウント

Firefox アカウントはユーザー名、パスワード、メールアドレス、年齢で作成できた。

今回は新規にアドオンを作る必要がない。作業の流れが可能かどうか見た後でやる。github に公式サンプルが沢山あるので、その一つを試しに web-ext build して非公開 (Unlisted) を選んでアドオンページにアップロードし、レビュー・署名してもらった。続いて表示された URL から署名後のパッケージをダウンロードすればインストールできた。

AMO に公開する場合は毎回これをやることになる (って書いてあったけど API でもできるのか?) が、今のところ web-ext publish のようなオプション (タスクというのか) はないようだ。さらに言えば new なり init なりもないけど他のこと整備する方が先だっただろうし、これからの話だろう。

2. JWT issuer と JWT key

JWT issuer と JWT key はアカウントのページ上部メニュー「APIキーの管理」へ進んで「生成」のようなボタンをクリックしたらすぐ表示された。当たり前だけど「秘密にしろ」と注意される。

3. web-ext sign

別のアドオンサンプルを web-ext build のち web-ext sign で署名した。zip ではなく xpi が作成される。

> web-ext sign --api-key=some_issuer --api-secret=some_key64
Building web extension from C:\path\to\webextensions-examples\beastify
No extension ID specified (it will be auto-generated)
Validating add-on [..........................................................................................]
Validation results: https://addons.mozilla.org/en-US/developers/upload/some_path
Downloading signed files: 100%
Downloaded:
    .\web-ext-artifacts\beastify-1.0-an+fx.xpi
Extension ID: {some_id}
SUCCESS

アドオンページにアップロードした場合と同様に META-INF ディレクトリが作成される (中身と使われ方)。

.web-extension-id ファイルが作られた。WebExtensions and the Add-on ID に「AMO の API を使っている (AMO のアドオンページにアップロードするのではない) 場合、リクエストに ID が必要」と書いてある。ほか、WebExtensions の一部の API では ID 使うらしい。筆者には使う必要はない(けど次で一応使っておいた)。「失くすな」と書いてあった。非公開アドオンだけど失くして ID が変わるとプロファイル中のデータの場所が変わるだろうから失くしたくない。

# This file was created by https://github.com/mozilla/web-ext
# Your auto-generated extension ID for addons.mozilla.org is:
{some_id}

変更から動作確認までの工程に組み入れて頻繁にやるものではない

ソフトウェアの署名ってこんな雑に (ボタンのアイコンどれがいいか試してるからまた署名してもらおう、のように) 使うのか、ということで動作確認したところ、一度 web-ext sign すると manifest.json に書いたバージョンを変更しないとエラーになり、署名されないと判った。

Building web extension from C:\path\to\ext
Using previously auto-generated extension ID: {someid}
Server response: Version already exists. (status: 409)
FAIL

そりゃそうだ……なので、変更→ビルド→署名→インストールは確かにできるのだが、インストール前のいち工程として頻繁にできない。実際はできるけど怒られたりアホ扱いされたりしたら良くない。次にインストールについて書いた後で、署名なしの一時的なインストール (web-ext run) について少し書いて終わる。

4. インストール

Extension Auto-Installer(AMO) でインストールできた。wget.exe --post-file=web-ext-artifacts/beastify-1.0-an+fx.xpi http://127.0.0.1:8888/。ただし ver. 57 以降はこのツールは使えないので、そんなに意味はない。web-ext run をやってみて嫌だったらエクスプローラからアドオン管理画面へドラッグアンドドロップすればいいや……と思っていたけど、インストール自体を頻繁にやらないのでどうでもよいことになった。

なお、一応 ID を使う場合も試した (既にインストールには署名が必須になっているので意味はないが ver. 54 だとできる)。manifest.jsonapplications.gecko.id を設けて .web-extension-id ファイルの内容を書き web-ext build してできた zip をインストールすれば良いが、警告が表示される。

f:id:PrsPrsBK:20170906120916j:plain

ID なしの zip ならばインストールできず、エラーメッセージ「Add-on_download_failed (error code -3)」が表示され、ドラッグアンドドロップしてみると「壊れているのでインストールできませんでした」となる。Lubuntu 17 の Firefox Developer Edition ver. 56 だと ID あるだけではインストールできない。

5. web-ext run (途中)

web-ext run によって署名なしでも一時的なインストールができるので、開発中はこれを使うことになる。ファイルを変更したら自動でリロードしてくれるらしい。まだちょっとスムーズな使用ができてない、というかリファレンスにあるような動作を確認できてないので、ここで終わり。後で書くかもしれない。

追記 少しだけど翌日続きを書いた

感想

当たり前だが署名が必要なのでちょっと時間かかるしオフラインでは同じことができない。署名必須になったことには文句はない。自分と同じように面倒くさがっている人間の参考になれば良いと思ってノートを書き直した。面倒だった。余談を述べると beast という言葉は (サンプルが選んだ言葉なんだけど) レビューで警告される。mozilla も面倒くさそうだと感じた。あと WebExtension's' と WebExtension と見かけたんだけど使い分けが分かっていない。

f:id:PrsPrsBK:20170906121336j:plain