aboutsummaryrefslogtreecommitdiff
path: root/files/ja/archive/add-ons/add-on_sdk/tools/jpm/index.html
blob: 8270fd12b3c80b5021acbc55c693743097a937f3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
---
title: jpm
slug: Archive/Add-ons/Add-on_SDK/Tools/jpm
translation_of: Archive/Add-ons/Add-on_SDK/Tools/jpm
---
<div class="blockIndicator warning">Support for extensions using XUL/XPCOM or the Add-on SDK was removed in Firefox 57, released November 2017. As there is no supported version of Firefox enabling these technologies, this page will be removed by December 2020.</div>

<p>{{LegacyAddonsNotice}}{{AddonSidebar}}</p>

<p><span class="seoSummary">jpm は Add-on をテスト、実行及びパッケージ化することができるコマンドラインツールです。</span></p>

<p>これはjpmのリファレンスページです。開始のための<a href="/ja/docs/Mozilla/Add-ons/SDK/Tutorials/Getting_Started_(jpm)">jpmチュートリアル</a>も参照してください。</p>

<p>jpmの使用方法は次のとおりです。</p>

<pre class="brush: bash">jpm [command] [options]
</pre>

<p>jpmは次のグローバルオプションをサポートしています:</p>

<pre class="brush: bash">-h, --help        - show a help message and exit
-V, --version     - print the jpm version number
--addon-dir       - directory for your source code,
                    defaulting to the current directory
</pre>

<h2 id="インストール"><a id="Installation" name="Installation">インストール</a></h2>

<p>jpmは、nodeパッケージマネージャ<a class="external external-icon" href="https://www.npmjs.org/package/jpm">npm</a>とともに配布されます。</p>

<h3 id="npm_のインストール">npm のインストール</h3>

<p>npmをインストールするには2つの方法があります。</p>

<ul>
 <li><a class="external external-icon" href="https://nodejs.org/">nodejs.org</a>からNode.jsをダウンロードしてインストールします。 Node.jsにはnpmが含まれます。</li>
 <li>あるいは、APTのようなパッケージマネージャがあれば、それを使ってnpmをインストールしてください。たとえば、UbuntuまたはDebianのターミナルウィンドウで、<code>sudo apt-get install nodejs nodejs-legacy </code><code> npm</code>と入力します。</li>
</ul>

<p>インストールできたかをテストするには、次のコマンドを実行します。</p>

<pre class="lang-js prettyprint prettyprinted">/usr/bin/env node -v</pre>

<p>"<em>/usr/bin/env: node: No such file or directory</em>"というエラーメッセージが表示され、パッケージマネージャーを使用してnodejsをインストールした場合、nodejsは別の実行可能ファイル名でインストールされている可能性があります。ただし、jpmとの互換性を確保するには、PATHに<code>node</code>という名前で存在する必要があります。DebianとUbuntuでは、これは互換性パッケージ<code>nodejs-legacy</code>を確実にインストールすることで解決できます。</p>

<pre class="brush:bash">sudo apt-get install nodejs-legacy</pre>

<p>他のディストリビューションでは、nodejsへのローカルシンボリックリンクを手動で作成する必要があります。</p>

<pre class="brush:bash">sudo ln -s "$(which nodejs)" /usr/local/bin/node</pre>

<h3 id="jpmのインストール">jpmのインストール</h3>

<p>npmがインストールされ、PATHに<code>node</code>が追加されたら、他のnpmパッケージと同じようにjpmをインストールします。</p>

<h4 id="グローバルにjpmをインストール">グローバルにjpmをインストール</h4>

<pre class="brush: bash">npm install jpm --global</pre>

<p>設定に応じて、次のコマンドをを管理者として実行する必要があります: <code>sudo npm install jpm --global</code></p>

<h4 id="ローカルにjpmをインストール">ローカルにjpmをインストール</h4>

<p>jpmをグローバルにインストールしたくない場合、またはインストールできない場合は、代わりにローカルにインストールすることができます。</p>

<pre class="brush: bash">cd $HOME &amp;&amp; npm install jpm</pre>

<p>ローカルにインストールしたときにターミナルから<code>jpm</code>を実行するには、最初に<code>"$HOME/node_modules/.bin/"</code>というディレクトリをターミナルのPATHに追加する必要があります。<code>$HOME/.profile</code>ファイルの最後に次の行を追加してPATHに永続的に(新しい端末が開くたびに<code>.profile</code>ファイルが実行されます)追加します。</p>

<pre class="brush: bash">export PATH="$HOME/node_modules/.bin/:$PATH"</pre>

<h4 id="Gitでjpmをインストール">Gitでjpmをインストール</h4>

<p>あるいはgitを使って最新のjpmを入手することもできます。</p>

<pre class="brush:bash">git clone https://github.com/mozilla-jetpack/jpm.git
cd jpm
npm install
npm link
</pre>

<h3 id="jpmのインストール後">jpmのインストール後</h3>

<p>インストール後、コマンドプロンプトで次のように入力します。</p>

<pre class="brush: bash">jpm</pre>

<p>利用可能なjpmコマンドを要約した画面が表示されます。cfxとは異なり、jpmは <code>--global</code>フラグを付けてインストールすることで、起動するすべてのコマンドプロンプトで使用できます。</p>

<h3 id="異なるバージョンのFirefoxをインストール">異なるバージョンのFirefoxをインストール</h3>

<p>Firefox 48では、ブランド版のリリースまたはベータ版のFirefoxでは、<a href="/ja/docs/Mozilla/Add-ons/Distribution">署名されていないアドオン</a>(つまり、開発中のアドオン)を使用することはできません。したがって、別のバージョンのFirefoxをダウンロードしてインストールする必要があります。旧バージョンのFirefoxを必要としない場合、あなたのオプションは<a href="https://www.mozilla.org/ja/firefox/developer/">Firefox Developer Edition</a><a href="https://www.mozilla.org/ja/firefox/channel/desktop/#nightly">Firefox Nightly</a><a href="https://wiki.mozilla.org/Add-ons/Extension_Signing#Unbranded_Builds">Unbranded Beta、またはUnbranded Release</a>です。</p>

<p>あなたのアドオンをテストするときは、<code>jpm run</code>コマンドに<code>-b</code>オプションを使う必要があります。<a href="/ja/docs/Archive/Add-ons/Add-on_SDK/Tools/jpm#ブラウザのバージョンの選択">ブラウザのバージョンの選択</a>を参照してください。</p>

<h3 id="困った時は">困った時は?</h3>

<p>これが表示されない場合は、ヘルプを求めてください。SDKユーザーとプロジェクトチームメンバーは<a href="https://groups.google.com/forum/#!forum/mozilla-labs-jetpack">プロジェクトのメーリングリスト</a>上で問題と提案について話し合っています。他の人が同じ問題を抱えている可能性がありますので、リストを検索してみてください。質問を投稿することもできます。<a href="http://irc.mozilla.org/">MozillaのIRCネットワーク</a>上の<a href="https://mibbit.com/?channel=%23jetpack&amp;server=irc.mozilla.org">#jetpack</a>で他のSDKユーザーとチャットすることもできます。</p>

<h2 id="コマンドリファレンス">コマンドリファレンス</h2>

<p>jpmは次のコマンドをサポートしています。</p>

<table class="fullwidth-table standard-table">
 <tbody>
  <tr>
   <td style="width: 20%;"><a href="/en-US/Add-ons/SDK/Tools/jpm#jpm_init"><code>jpm init</code></a></td>
   <td>あなたのアドオンの出発点としてスケルトンアドオンを作成します。</td>
  </tr>
  <tr>
   <td><a href="/en-US/Add-ons/SDK/Tools/jpm#jpm_run"><code>jpm run</code></a></td>
   <td>アドオンがインストールされているFirefoxのインスタンスを起動します。</td>
  </tr>
  <tr>
   <td><a href="/en-US/Add-ons/SDK/Tools/jpm#jpm_test"><code>jpm test</code></a></td>
   <td>アドオンの単体テストを実行します。</td>
  </tr>
  <tr>
   <td><a href="/en-US/Add-ons/SDK/Tools/jpm#jpm_xpi"><code>jpm xpi</code></a></td>
   <td>Firefoxのアドオンのインストールファイル形式である<a href="/ja/docs/XPI">XPI</a>ファイルとしてアドオンをパッケージ化します。</td>
  </tr>
  <tr>
   <td><a href="/en-US/Add-ons/SDK/Tools/jpm#jpm_post"><code>jpm post</code></a></td>
   <td>アドオンを<a href="/ja/docs/XPI">XPI</a>ファイルとしてパッケージ化し、それをいくつかのURLに投稿します。</td>
  </tr>
  <tr>
   <td><a href="/en-US/Add-ons/SDK/Tools/jpm#jpm_watchpost"><code>jpm watchpost</code></a></td>
   <td>ファイルが変更されたときにアドオンを<a href="/ja/docs/XPI">XPI</a>ファイルとしてパッケージ化し、それをいくつかのURLに投稿します。</td>
  </tr>
  <tr>
   <td><a href="/en-US/Add-ons/SDK/Tools/jpm#jpm_sign"><code>jpm sign</code></a></td>
   <td>アドオンを<a href="/ja/docs/XPI">XPI</a>ファイルとしてパッケージ化し、Mozillaが署名した新しいXPIを取得します。</td>
  </tr>
 </tbody>
</table>

<h3 id="jpm_init">jpm init</h3>

<p>このコマンドは、新しいアドオンを初期化します。</p>

<p>ディレクトリを作成してそこに移動し、<code>jpm init</code>コマンドを実行します。</p>

<pre class="brush: bash">mkdir my-addon
cd my-addon
jpm init</pre>

<p>ここでアドオンに関するいくつかの情報を入力するよう求められます。これは、アドオンの<a href="/ja/Add-ons/SDK/Tools/package_json">package.json</a>ファイルの作成に使用されます。</p>

<ul>
 <li><a href="/ja/docs/Archive/Add-ons/Add-on_SDK/Tools/package_json#title">title</a></li>
 <li><a href="/ja/docs/Archive/Add-ons/Add-on_SDK/Tools/package_json#name">name</a>: これはデフォルトで、jpm init を実行しているディレクトリの名前になります。<a href="/ja/docs/Archive/Add-ons/Add-on_SDK/Tools/package_json#id"><code>id</code></a>フィールドがpackage.jsonに存在しない限り、jpmは<code>name</code>に "@"を付加し、その結果を<a href="https://developer.mozilla.org/en-US/Add-ons/Install_Manifests#id">アドオンのインストールマニフェストの<code>id</code>フィールド</a>として使用します。</li>
 <li><a href="/ja/docs/Archive/Add-ons/Add-on_SDK/Tools/package_json#version">version</a></li>
 <li><a href="/ja/docs/Archive/Add-ons/Add-on_SDK/Tools/package_json#description">description</a></li>
 <li><a href="/ja/docs/Archive/Add-ons/Add-on_SDK/Tools/package_json#main">entry point</a> (package.jsonの "main"にマップされます)</li>
 <li><a href="/ja/docs/Archive/Add-ons/Add-on_SDK/Tools/package_json#author">author</a></li>
 <li><a href="/ja/docs/Archive/Add-ons/Add-on_SDK/Tools/package_json#engines">engines</a> (サポートされるアプリケーション)</li>
 <li><a href="/ja/docs/Archive/Add-ons/Add-on_SDK/Tools/package_json#license">license</a></li>
</ul>

<p>これらのフィールドのほとんどはデフォルト値があり、質問の後に角括弧で表示されています。Enterキーを押すだけでアドオンがデフォルト値になります。</p>

<p>値を提供したり、これらのプロパティのデフォルトを受け入れると、 "package.json"の完全な内容が表示され、それを受け入れるように求められます。</p>

<p>次にjpmは、以下のファイル構造で、アドオン開発の出発点としてスケルトンアドオンを作成します。</p>

<ul class="directory-tree">
 <li>my-addon
  <ul>
   <li>index.js</li>
   <li>package.json</li>
   <li>test
    <ul>
     <li>test-index.js</li>
    </ul>
   </li>
  </ul>
 </li>
</ul>

<h3 id="jpm_run">jpm run</h3>

<p><span id="result_box" lang="ja"><span>このコマンドは、アドオンがインストールされたFirefoxの新しいインスタンスを実行します。</span></span></p>

<pre class="brush: bash">jpm run</pre>

<p><code>jpm run</code> は次のオプションを受け入れます:</p>

<table class="fullwidth-table standard-table">
 <tbody>
  <tr>
   <td style="width: 30%;"><code>-b --binary BINARY</code></td>
   <td>
    <p>BINARYで指定されたバージョンのFirefoxを使用してください。 BINARYは、フルパスまたはカレントディレクトリに対する相対パスとして指定できます。</p>

    <pre class="brush: bash">
jpm run -b /path/to/Firefox/Nightly</pre>
    <a href="/ja/docs/Archive/Add-ons/Add-on_SDK/Tools/jpm#ブラウザのバージョンの選択">ブラウザのバージョンの選択</a>を参照してください。</td>
  </tr>
  <tr>
   <td><code>--binary-args CMDARGS</code></td>
   <td>
    <p>Firefoxに<a href="https://developer.mozilla.org/en-US/docs/Mozilla/Command_Line_Options">追加の引数</a>を渡します。</p>

    <p>たとえば、Firefoxに<code>-jsconsole</code>引数を渡して<a href="/ja/docs/Tools/Browser_Console">ブラウザコンソール</a>を起動するには、次のようにします。</p>

    <pre class="brush: bash">
jpm run --binary-args -jsconsole</pre>

    <p>複数の引数、または空白を含む引数を渡すには、それらを引用符で囲みます。</p>

    <pre class="brush: bash">
jpm run --binary-args '-url mzl.la -jsconsole'</pre>
   </td>
  </tr>
  <tr>
   <td><code>--debug</code></td>
   <td>アドオンに接続されている<a href="/ja/docs/Mozilla/Add-ons/WebExtensions/デバッグ">アドオンデバッガ</a>を実行します。</td>
  </tr>
  <tr>
   <td><code>-o --overload PATH</code></td>
   <td>
    <p>Firefoxに組み込まれたSDKモジュールを使用するのではなく、PATHにあるモジュールを使用します。<code>-o</code>が指定され、PATHが省略されている場合、jpmはJETPACK_ROOT環境変数を検索し、その値をパスとして使用します。</p>

    <p>詳細については、<a href="/ja/Add-ons/SDK/Tools/jpm#Overloading_the_built-in_modules">組み込みモジュールのオーバーロード</a>を参照してください。</p>
   </td>
  </tr>
  <tr>
   <td><code>-p --profile=<code> PROFILE</code></code></td>
   <td>
    <p>デフォルトでは、jpmは、jpm runを呼び出すたびにきれいな一時的なFirefox<a href="https://support.mozilla.org/ja/kb/profiles-where-firefox-stores-user-data">プロファイル</a>を使用します。既存のプロファイルでFirefoxを起動するようにjpmに指示するには、<code>--profile</code>オプションを使用します。</p>

    <p>PROFILEの値は、プロファイル名またはプロファイルへのパスです。</p>

    <p>詳細については、<a href="/ja/docs/Archive/Add-ons/Add-on_SDK/Tools/jpm$edit#Using_profiles">プロファイルの使用</a>を参照してください。</p>
   </td>
  </tr>
  <tr>
   <td><code>-v --verbose</code></td>
   <td>詳細な操作。</td>
  </tr>
  <tr>
   <td><code>--no-copy</code></td>
   <td>
    <div class="warning"><code>jpm run|test</code>は多くの設定を変更するので、注意して使用してください。メインのプロファイルでは使用しないでください。</div>

    <div class="note">これは<code>--profile</code>が使用されている場合のみ適用されます。</div>
    使用されているプロファイルのコピーを無効にします。これにより、プロファイルを再利用することができます。</td>
  </tr>
 </tbody>
</table>

<h3 id="jpm_test">jpm test</h3>

<p>Use this command to run an add-on's unit tests. The command:</p>

<ul>
 <li>Looks for a directory called "test" within the current directory (or <code>--addon-dir</code>).</li>
 <li>Opens every file in there whose name starts with "test-". Make note of the hyphen after "test" in the filename. <code>jpm test</code> include a file called "test-myCode.js", but will exclude files called "test_myCode.js" or "testMyCode.js")</li>
 <li>call every function exported from that file whose name starts with "test".</li>
</ul>

<pre class="brush: bash">jpm test
</pre>

<p>See the <a href="/en-US/Add-ons/SDK/Tutorials/Unit_testing">tutorial on unit testing</a> and the <a href="/en-US/Add-ons/SDK/Low-Level_APIs/test_assert">reference documentation for the <code>assert</code> module</a> for more details on this.</p>

<p><code>jpm test</code> accepts the following options:</p>

<table class="fullwidth-table standard-table">
 <tbody>
  <tr>
   <td><code>-b --binary BINARY</code></td>
   <td>
    <p>Use the version of Firefox specified in BINARY. BINARY may be specified as a full path or as a path relative to the current directory.</p>

    <pre class="brush: bash">
jpm test -b /path/to/Firefox/Nightly</pre>

    <p>See <a href="/en-US/Add-ons/SDK/Tools/jpm#Selecting_a_browser_version">Selecting a browser version</a>.</p>
   </td>
  </tr>
  <tr>
   <td><code>--binary-args CMDARGS</code></td>
   <td>
    <p>Pass <a href="http://kb.mozillazine.org/Command_line_arguments">extra arguments</a> to Firefox.</p>

    <p>For example, to pass the <code>-jsconsole</code> argument to Firefox, which will launch the <a href="/en-US/docs/Tools/Browser_Console">Browser Console</a>, try the following:</p>

    <pre class="brush: bash">
jpm test --binary-args -jsconsole</pre>

    <p>To pass multiple arguments, or arguments containing spaces, quote them:</p>

    <pre class="brush: bash">
jpm test --binary-args '-url mzl.la -jsconsole'</pre>
   </td>
  </tr>
  <tr>
   <td><code>--debug</code></td>
   <td>Run the <a href="/en-US/Add-ons/Add-on_Debugger">Add-on Debugger</a> attached to the add-on.</td>
  </tr>
  <tr>
   <td style="width: 30%;"><code>-f --filter FILE[:TEST]</code></td>
   <td>
    <p>Only run tests whose filenames match FILE and optionally match TEST, both regexps.</p>

    <pre class="brush: bash">
jpm test --filter base64:btoa</pre>

    <p>The above command only runs tests in files whose names contain "base64", and in those files only runs tests whose names contain "btoa".</p>
   </td>
  </tr>
  <tr>
   <td style="width: 30%;"><code>-o --overload PATH</code></td>
   <td>
    <p>Rather than use the SDK modules built into Firefox, use the modules found at PATH. If <code>-o</code> is specified and PATH is omitted, jpm will look for the JETPACK_ROOT environment variable and use its value as the path.</p>

    <p>See <a href="/en-US/Add-ons/SDK/Tools/jpm#Overloading_the_built-in_modules">Overloading the built-in modules</a> for more information.</p>
   </td>
  </tr>
  <tr>
   <td style="width: 30%;"><code>-p --profile<code> PROFILE</code></code></td>
   <td>
    <p>By default, jpm uses a clean temporary Firefox <a href="https://support.mozilla.org/en-US/kb/profiles-where-firefox-stores-user-data">profile</a> each time you call jpm run. Use the <code>--profile</code> option to instruct jpm to launch Firefox with an existing profile.</p>

    <p>The PROFILE value may be a profile name or the path to the profile.</p>

    <p>See <a href="#Using_profiles">Using profiles</a> for more information.</p>
   </td>
  </tr>
  <tr>
   <td><code>--stop-on-error</code></td>
   <td>
    <p>By default, jpm test keeps running tests even after tests fail. Specify <code>--stop-on-error</code> to stop running tests after the first failure:</p>

    <pre class="brush: bash">
jpm test --stop-on-error</pre>
   </td>
  </tr>
  <tr>
   <td><code>--tbpl</code></td>
   <td>Print test output in <a href="https://treeherder.mozilla.org/">Treeherder</a> format</td>
  </tr>
  <tr>
   <td><code>--times NUMBER</code></td>
   <td>
    <p>Run tests NUMBER of times:</p>

    <pre class="brush: bash">
jpm test --times 2</pre>
   </td>
  </tr>
  <tr>
   <td><code>-v --verbose</code></td>
   <td>Verbose operation.</td>
  </tr>
  <tr>
   <td><code>--no-copy</code></td>
   <td>
    <div class="warning"><code>jpm run|test</code>は多くの設定を変更するので、注意して使用してください。メインのプロファイルでは使用しないでください。</div>

    <div class="note">This only applies when <code>--profile</code> is used.</div>
    Disables the copying of the profile used, which allows one to reuse a profile.</td>
  </tr>
 </tbody>
</table>

<h3 id="jpm_xpi">jpm xpi</h3>

<p>This command packages the add-on as an <a href="/en-US/docs/XPI">XPI</a> file, which is the install file format for Mozilla add-ons.</p>

<pre class="brush: bash">jpm xpi</pre>

<p>It looks for a file called <code>package.json</code> in the current directory (or <code>--addon-dir</code>) and creates the corresponding XPI file. It ignores any ZIPs or XPIs in the add-on's root, and any test files. It includes all other files. If you want to exclude extra files, see <a href="/en-US/Add-ons/SDK/Tools/jpmignore">the .jpmignore file</a>.</p>

<p>Once you have built an XPI file, you can distribute your add-on by submitting it to <a href="https://addons.mozilla.org/">addons.mozilla.org</a>.</p>

<p><code>jpm xpi</code> accepts the following option:</p>

<table class="fullwidth-table standard-table">
 <tbody>
  <tr>
   <td><code>--dest-dir</code></td>
   <td>
    <p>Optional destination directory for the generated XPI file. The current working directory is the default destination.</p>
   </td>
  </tr>
  <tr>
   <td><code>-v --verbose</code></td>
   <td>
    <p>Verbose operation:</p>

    <pre class="brush: bash">
jpm xpi -v</pre>
   </td>
  </tr>
 </tbody>
</table>

<h3 id="jpm_post">jpm post</h3>

<p>This command packages the add-on as an <a href="/en-US/docs/XPI">XPI</a> file then posts it to some URL.</p>

<pre class="brush: bash">jpm post</pre>

<p>It looks for a file called <code>package.json</code> in the current directory (or <code>--addon-dir</code>) and creates an XPI file with which to post to the <code>--post-url</code>.</p>

<p><code>jpm post</code> accepts the following options:</p>

<table class="fullwidth-table standard-table">
 <tbody>
  <tr>
   <td><code>--post-url URL</code></td>
   <td>
    <p>The URL to post the extension to after creating an XPI.</p>

    <pre class="brush: bash">
jpm post --post-url http://localhost:8888/</pre>

    <p>See <a href="https://www.npmjs.com/package/jpm#using-post-and-watchpost">Using Post and Watchpost</a> for more information.</p>
   </td>
  </tr>
  <tr>
   <td><code>-v --verbose</code></td>
   <td>
    <p>Verbose operation:</p>

    <pre class="brush: bash">
jpm post --post-url http://localhost:8888/ -v</pre>
   </td>
  </tr>
 </tbody>
</table>

<h3 id="jpm_watchpost">jpm watchpost</h3>

<p>This command packages the add-on as an <a href="/en-US/docs/XPI">XPI</a> file then posts it to some URL whenever a file in the current working directory changes.</p>

<pre class="brush: bash">jpm watchpost</pre>

<p>Creates an XPI whenever a file changes in the current working directory (or <code>--addon-dir</code>) and posts that to the <code>--post-url</code>.</p>

<p><code>jpm watchpost</code> accepts the following options:</p>

<table class="fullwidth-table standard-table">
 <tbody>
  <tr>
   <td><code>--post-url URL</code></td>
   <td>
    <p>The URL to post the extension to after creating an XPI.</p>

    <pre class="brush: bash">
jpm watchpost --post-url http://localhost:8888/</pre>

    <p>See <a href="https://www.npmjs.com/package/jpm#using-post-and-watchpost">Using Post and Watchpost</a> for more information.</p>
   </td>
  </tr>
  <tr>
   <td><code>-v --verbose</code></td>
   <td>
    <p>Verbose operation:</p>

    <pre class="brush: bash">
jpm watchpost --post-url http://localhost:8888/ -v</pre>
   </td>
  </tr>
 </tbody>
</table>

<h3 id="jpm_sign">jpm sign</h3>

<div class="note">
<p>This feature is only supported from jpm 1.0.4 onwards.</p>
</div>

<p>This command retrieves a new <a href="/en-US/docs/XPI">XPI</a> for your add-on signed by Mozilla. This allows you to <a href="#Supporting_updates_for_self-hosted_add-ons">self-host your add-on</a> so that users can install it without error when <a href="https://wiki.mozilla.org/Add-ons/Extension_Signing">signed add-ons are required</a>.</p>

<p>You can sign an XPI you've already generated by passing the XPI file in the <code>--xpi</code> argument, like this:</p>

<pre class="bz_comment_text" id="comment_text_2">jpm sign --api-key ${JWT_ISSUER} --api-secret ${JWT_SECRET} --xpi &lt;xpi file&gt;</pre>

<p>Alternatively, you can omit the <code>--xpi</code> argument, in which case <code>jpm sign</code> will generate an XPI from the current directory (or <code>--addon-dir</code>).</p>

<pre class="brush: bash">jpm sign --api-key ${JWT_ISSUER} --api-secret ${JWT_SECRET}</pre>

<p>This submits an <a href="/en-US/docs/XPI">XPI</a> it to the <a href="https://addons.mozilla.org/">addons.mozilla.org</a> <a href="https://olympia.readthedocs.org/en/latest/topics/api/signing.html">signing API</a>, then downloads a signed XPI to the working directory if it passes validation.</p>

<p>To get values for <code>--api-key</code> and <code>--api-secret</code>, you will need to <a href="https://addons.mozilla.org/en-US/developers/addon/api/key/">create API credentials on addons.mozilla.org</a>. On the AMO key management page, these values are labeled "JWT_Issuer" and "JWT_Secret".</p>

<p>Here are some possible outcomes of running the <code>sign</code> command:</p>

<ul>
 <li>Your add-on passed validation, was signed by Mozilla, and a new signed <a href="/en-US/docs/XPI">XPI</a> was downloaded to your working directory.</li>
 <li>Your add-on failed validation, was not signed, and you got a link to a detailed report. After fixing the validation errors, you can run the command again.</li>
 <li>You add-on passed validation but it could not be automatically signed because your add-on is <a href="/en-US/Add-ons/Distribution">listed</a>. Listed add-ons will require a manual review before they can be signed.</li>
 <li>Your add-on at this exact version number already exists, so it was not signed. Increment the version number in your <a href="/en-US/Add-ons/SDK/Tools/package_json">package.json</a> file and run the command again.</li>
</ul>

<p>Under the hood, <code>jpm sign</code> creates an unlisted add-on inside <a href="https://addons.mozilla.org/">addons.mozilla.org</a>, which means you must distribute the XPI file yourself for your users to install it. If you need to create a listed add-on, just <a href="https://addons.mozilla.org/en-US/developers/addon/submit/2">submit it directly to addons.mozilla.org</a> where it is signed automatically. See the <a href="/en-US/docs/Extension_Versioning%2C_Update_and_Compatibility#Debugging_and_solving_problems">debugging</a> section if you are experiencing difficulty installing a signed add-on.</p>

<p><code>jpm sign</code> accepts the following options:</p>

<table class="fullwidth-table standard-table">
 <tbody>
  <tr>
   <td><code>--api-key=JWT_ISSUER</code></td>
   <td>
    <p>API access key (string) generated on the <a href="https://addons.mozilla.org/en-US/developers/addon/api/key/">addons.mozilla.org key management page</a>.</p>

    <p>On the AMO key management page, this value is labeled "JWT Issuer".</p>
   </td>
  </tr>
  <tr>
   <td><code>--api-secret=JWT_SECRET</code></td>
   <td>
    <p>API access secret (string) generated on the <a href="https://addons.mozilla.org/en-US/developers/addon/api/key/">addons.mozilla.org key management page</a>. This value should be guarded with care and never checked into version control. If your secret is compromised, another developer could upload add-ons to your account. You should revoke and regenerate compromised API credentials immediately.</p>

    <p>On the AMO key management page, this value is labeled "JWT Secret".</p>
   </td>
  </tr>
  <tr>
   <td><code>--api-url-prefix=http://.../api</code></td>
   <td>
    <p>An optional API URL prefix in case you'd like to use a pre-production signing API.</p>

    <p>For example, you could pass <code>https://addons-dev.allizom.org/api/v3</code> to use the dev instance of <a href="https://addons.mozilla.org/">addons.mozilla.org</a>.</p>
   </td>
  </tr>
  <tr>
   <td><code>--xpi=/path/to/file.xpi</code></td>
   <td>
    <p>An <a href="/en-US/docs/XPI">XPI</a> file to sign. When no file is specified, a new XPI will be generated from the current directory (or <code>--addon-dir</code>).</p>
   </td>
  </tr>
 </tbody>
</table>

<h2 id="テクニック">テクニック</h2>

<h3 id="ブラウザのバージョンの選択">ブラウザのバージョンの選択</h3>

<p>By default, <code>jpm run</code> and <code>jpm test</code> runs the release version of Firefox. You can instruct jpm to use a different version in one of two ways:</p>

<ul>
 <li>
  <p>You can use the <code>-b</code> or <code>--binary</code> option to instruct jpm to run a different version of Firefox. You can supply a path to a specific binary:</p>

  <pre class="brush: bash">jpm run -b /path/to/Firefox/Nightly</pre>

  <p>As a shorthand for this, you can pass "nightly", "firefoxdeveloperedition", "aurora", "beta", or "firefox" and jpm will look in the default location for these Firefox versions [Note: As of Firefox 48, the shorthands "firefox" and "beta" will resolve to versions of Firefox which will not run your add-on. This is due to Firefox 48, and later, not having the option to run add-ons which are <a href="/en-US/docs/Mozilla/Add-ons/Distribution">unsigned</a>.]:</p>

  <pre class="brush: bash">jpm run -b nightly</pre>
 </li>
 <li>
  <p>You can set the <code>JPM_FIREFOX_BINARY</code> environment variable with the path to the version of Firefox you want to run. When you invoke <code>jpm run</code> or <code>jpm test</code> without the <code>-b</code> option, jpm first checks <code>JPM_FIREFOX_BINARY</code>, and use this as the path if it is set.</p>
 </li>
</ul>

<h3 id="Using_.jpmignore_to_ignore_files">Using <code>.jpmignore</code> to ignore files</h3>

<p>Using <code>.jpmignore</code> is similar to using <code>.gitignore</code> with <code>git</code>, <code>.hgignore</code> with Mercurial, or <code>.npmignore</code> with <code>npm</code>. By using this file, you can let <code>jpm</code> know which files you would like it to ignore when building a <code>.xpi</code> file with <code>jpm xpi</code>.</p>

<p>Here is an example:</p>

<pre class="brush: bash"># Ignore .DS_Store files created by mac
.DS_Store

# Ignore any zip or xpi files
*.zip
*.xpi
</pre>

<p>A <code>.jpmignore</code> file with the above contents would ignore all zip files and <code>.DS_Store</code> files from the xpi generated by <code>jpm xpi</code>.</p>

<h3 id="プロファイルの使用">プロファイルの使用</h3>

<p>By default, <code>jpm run</code> uses a new profile each time it is executed. This means that any profile-specific data entered from one run of <code>jpm</code> is not, by default, available in the next run.</p>

<p>This includes, for example, any extra add-ons you installed, or your history, or any data stored using the <a href="/en-US/Add-ons/SDK/High-Level_APIs/simple-storage">simple-storage</a> API.</p>

<p>To make <code>jpm</code> use a specific profile, pass the <code>--profile</code> option, specifying the name of the profile you wish to use, or the path to the profile.</p>

<pre class="brush: bash">jpm run --profile boogaloo
</pre>

<pre class="brush: bash">jpm run --profile path/to/boogaloo</pre>

<p>Use the <a href="https://support.mozilla.org/en-US/kb/profile-manager-create-and-remove-firefox-profiles">profile manager</a> to create a new profile if needed.</p>

<p>If you need changes to the profile to persist, add the <code>--no-copy</code> argument. However beware that jpm might also apply changes to the profile, setting some preferences that will make it unusable for daily usage.</p>

<h3 id="ブラウザを再起動せずに開発する">ブラウザを再起動せずに開発する</h3>

<p>Because <code>jpm run</code> restarts the browser each time you invoke it, it can be a little cumbersome if you are making very frequent changes to an add-on. An alternative development model is to use the <a href="https://addons.mozilla.org/en-US/firefox/addon/autoinstaller/" rel="noreferrer">Extension Auto-Installer</a> add-on: this listens for new XPI files on a specified port and installs them automatically. That way you can test new changes without needing to restart the browser:</p>

<ul>
 <li>make a change to your add-on</li>
 <li>run <code>jpm post --post-url http://localhost:8888/</code>, to make an XPI and post it.</li>
</ul>

<p>You could even automate this workflow with a simple script. For example:</p>

<pre class="brush: bash">jpm watchpost --post-url http://localhost:8888/
</pre>

<p>Note that the logging level defined for the console is different when you use this method, compared to the logging level used when an add-on is run using <code>jpm run</code>. This means that if you want to see the output from <a href="/en-US/Add-ons/SDK/Tutorials/Logging" rel="noreferrer"><code>console.log()</code></a> messages, you have to tweak a setting. See the documentation on <a href="/en-US/Add-ons/SDK/Tools/console#Logging_Levels" rel="noreferrer">logging levels</a> for the details on this.</p>

<h3 id="組み込みモジュールのオーバーロード">組み込みモジュールのオーバーロード</h3>

<p>The SDK modules you use to implement your add-on are built into Firefox. When you run or package an add-on using <code>jpm run</code> or <code>jpm xpi</code>, the add-on uses the versions of the modules in the version of Firefox that hosts it.</p>

<p>As an add-on developer, this is usually what you want. But if you're developing the SDK modules themselves, of course, it isn't. In this case you need to:</p>

<ul>
 <li>Get a local copy of the SDK modules that you want: this usually means checking out the SDK from its <a href="https://github.com/mozilla/addon-sdk" rel="noreferrer">GitHub repo</a></li>
 <li>Set the <code>JETPACK_ROOT</code> environment variable to your local copy</li>
 <li>Pass the <code>-o</code> option to <code>jpm run</code> or <code>jpm xpi</code>:</li>
</ul>

<pre class="brush:bash">jpm run -o
</pre>

<p>This instructs jpm to use the local copies of the SDK modules, not the ones in Firefox. If you do not want to set the <code>JETPACK_ROOT</code> environment variable, you can pass the location of your copy of the SDK modules along with <code>-o</code>:</p>

<pre class="brush:bash">jpm run -o "/path/to/addon-sdk/"</pre>

<p>The path must be an absolute path and point to the SDK's root (not <code>addon-sdk/sdk</code> or <code>addon-sdk/sdk/lib</code>, for instance).</p>

<h3 id="セルフホスト型アドオンのサポートアップデート">セルフホスト型アドオンのサポートアップデート</h3>

<div class="note">
<p>This feature is only supported from jpm 1.0.3 onwards.</p>
</div>

<p>When you make updates to your add-on to add features or fix bugs, you'll want any previously installed versions of the add-on to update themselves to the new version.</p>

<p>If you list your add-on on <a href="https://addons.mozilla.org/">addons.mozilla.org</a>, then all you have to do here is submit the new version; add-ons default to checking <a href="https://addons.mozilla.org/">addons.mozilla.org</a> for new versions of themselves. You can stop reading this section.</p>

<p>If you do not list your add-on on <a href="https://addons.mozilla.org/">addons.mozilla.org</a>, you need to generate a Mozilla-signed XPI and tell Firefox where it can find new versions of your add-on. The way this works is:</p>

<ul>
 <li>you run <a href="/en-US/Add-ons/SDK/Tools/jpm#jpm_sign">jpm sign</a> anytime you need to create a new version</li>
 <li>you host the signed add-on XPI and update it when you need to</li>
 <li>you host an "update manifest", which, among other things, contains a URL pointing to the XPI</li>
 <li>your add-on tells Firefox where it can find the update manifest</li>
</ul>

<p>To do this, include two extra keys in package.json:</p>

<ul>
 <li><code><a href="/en-US/Add-ons/SDK/Tools/package_json#updateURL">updateURL</a></code>: This URL is included in the <a href="/en-US/docs/Mozilla/Add-ons/Install_Manifests">install manifest</a> of the XPI file that <code>jpm xpi</code> builds. It points to your update manifest. The <code>updateURL</code> value <em>may</em> be HTTPS. If it is not, then you'll also need to sign the update manifest, and then include the public key using the <code><a href="/en-US/Add-ons/SDK/Tools/package_json#updateKey">updateKey</a></code> field in package.json. See <a href="/en-US/docs/Extension_Versioning%2C_Update_and_Compatibility#Securing_Updates">Securing updates</a> for more on this.</li>
 <li><code><a href="/en-US/Add-ons/SDK/Tools/package_json#updateLink">updateLink</a></code>: This URL is included in the update manifest file. It points to the XPI, and <em>must</em> be an HTTPS URL.</li>
</ul>

<p><img alt="" src="https://mdn.mozillademos.org/files/11847/addons-update.svg" title="[https://mdn.mozillademos.org]"></p>

<p>If you include <code>updateURL</code> and <code>updateLink</code> (and also <code>updateKey</code> in case <code>updateURL</code> is not HTTPS), then <code>jpm xpi</code> will:</p>

<ul>
 <li>Embed the value you supplied for <code>updateURL</code> in the XPI it generates.</li>
 <li>Generate an update manifest alongside the XPI, and embed the value you supplied for <code>updateLink</code> in the manifest.</li>
</ul>

<p>You then host the update manifest at <code>updateURL</code>, and host new versions of the XPI at <code>updateLink</code>.</p>

<p>For some more details on this, see <a href="/en-US/docs/Extension_Versioning,_Update_and_Compatibility#Automatic_Add-on_Update_Checking">Automatic Add-on Update Checking</a>.</p>