summaryrefslogtreecommitdiffstats
path: root/chrome/common/extensions/docs/static/packaging.html
blob: d26fa245798ce996862cbe517882530f128867f1 (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
<div id="pageData-name" class="pageData">Packaging</div>
<div id="pageData-showTOC" class="pageData">true</div>

<p>
This page describes how to package your extension.
As the <a href="overview.html">Overview</a> explains,
extensions are packaged as signed ZIP files
with the file extension "crx"&mdash;for example,
<code>myextension.crx</code>.
</p>

<p>
<b>Note:</b>
You might not need to package your extension.
If you publish your extension using the
<a href="https://chrome.google.com/webstore/developer/dashboard">Chrome Developer Dashboard</a>,
then the only reason to create your own <code>.crx</code> file
would be to distribute a non-public version&mdash;for example,
to alpha testers.
You can find information on publishing extensions and apps in the
Chrome Web Store getting started tutorial, starting at
<a href="http://code.google.com/chrome/webstore/docs/get_started_simple.html#step5">Step 5: Zip up your app</a>.
</p>

<p>
When you package an extension,
the extension is assigned a unique key pair.
The extension's ID is based on a hash of the public key.
The private key is kept private
and used to sign each version of the extension.
</p>


<h2>Creating a package</h2>

<p>To package an extension:</p>
<ol>
  <li>
    Bring up the Extensions management page
    by going to this URL:
    <blockquote>
    <b>chrome://extensions</b>
    </blockquote>
  </li>

  <li>
    If <b>Developer mode</b> has a + by it,
    click the +.
  </li>

  <li>
    Click the <b>Pack extension</b> button.
    A dialog appears.
  </li>

  <li>
    In the <b>Extension root directory</b> field,
    specify the path to the extension's folder&mdash;for example,
    <code>c:\myext</code>.
    (Ignore the other field;
    you don't specify a private key file
    the first time you package a particular extension.)
  </li>

  <li>
    Click <b>OK</b>.
    The packager creates two files:
    a <code>.crx</code> file,
    which is the actual extension that can be installed,
    and a <code>.pem</code> file,
    which contains the private key.
  </li>
</ol>


<p>
<b>Do not lose the private key!</b>
Keep the <code>.pem</code> file secret and in a safe place.
You'll need it later if you want to do any of the following:
</p>
<ul>
<li><a href="#update">Update</a> the extension</li>
<li><a href="#upload">Upload</a> the extension to the Chrome Web Store</li>
</ul>

<p>
If the extension is successfully packaged, you'll see a dialog like this
that tells you where to find
the <code>.crx</code> and <code>.pem</code> files:</p>
</p>

<img src="images/package-success.gif"
  width="554" height="208" />


<h2 id="update">Updating a package</h2>

<p>To create an updated version of your extension:</p>
<ol>
  <li>
    Increase the version number in <code>manifest.json</code>.
  </li>

  <li>
    Bring up the Extensions management page
    by going to this URL: <b>chrome://extensions</b>
  </li>

  <li>
    Click the <b>Pack extension</b> button.
    A dialog appears.
  </li>

  <li>
    In the <b>Extension root directory</b> field,
    specify the path to the extension's folder&mdash;for example,
    <code>c:\myext</code>.
  </li>

  <li>
    In the <b>Private key file</b> field,
    specify the location of the
    already generated <code>.pem</code> file for this extension&mdash;for
    example, <code>c:\myext.pem</code>.
  </li>

  <li>
    Click <b>OK</b>.
  </li>
</ol>

<p>If the updated extension is successfully packaged, you'll see a dialog like this:</p>

<img src="images/update-success.gif"
  width="298" height="160" />


<h2 id="upload"> Uploading a previously packaged extension to the Chrome Web Store</h2>

<p>
You can use the Chrome Developer Dashboard
to upload an extension that you've previously packaged yourself.
However, unless you take special steps,
the extension's ID in the Chrome Web Store
will be different from its ID in the package you created.
This different ID might be a problem if you've
distributed your extension package,
because it allows users to install multiple versions of your extension,
each with its own local data.
</p>

<p>
If you want to keep the extension ID the same,
follow these steps:
</p>

<ol>
  <li> Rename the private key that was generated
    when you created the <code>.crx</code> file to <code>key.pem</code>. </li>
  <li> Put <code>key.pem</code> in the top directory
    of your extension. </li>
  <li> Compress that directory into a ZIP file. </li>
  <li> Upload the ZIP file using the
    <a href="https://chrome.google.com/webstore/developer/dashboard">Chrome Developer Dashboard</a>. </li>
</ol>


<h2>Packaging at the command line</h2>

<p>
Another way to package extensions
is by invoking <code>chrome.exe</code> at the command line.
Use the <code>--pack-extension</code> flag
to specify the location of the extension's folder.
Use <code>--pack-extension-key</code>
to specify the location of the extension's private key file.
For example:
</p>

<pre>
chrome.exe --pack-extension=c:\myext --pack-extension-key=c:\myext.pem
</pre>

<p>
To suppress the dialog,
add <code>--no-message-box</code> to the command.
</p>

<h2>Package format and scripts</h2>
<p>
For more information on the format, as well as pointers to scripts you can use
to create <code>.crx</code> files, see <a href="crx.html">CRX Package Format</a>.
</p>