{"id":272,"date":"2012-07-17T17:50:59","date_gmt":"2012-07-17T08:50:59","guid":{"rendered":"http:\/\/appsweets.net\/blog\/?p=272"},"modified":"2012-07-17T17:50:59","modified_gmt":"2012-07-17T08:50:59","slug":"building-a-xpi","status":"publish","type":"post","link":"http:\/\/appsweets.net\/blog\/2012\/07\/17\/building-a-xpi\/","title":{"rendered":"building a xpi"},"content":{"rendered":"<div class=\"856f7bdf6ce2541193600c6e03dd1a56\" data-index=\"1\" style=\"float: left; margin: 16px 16px 16px 0;\">\n<script type=\"text\/javascript\"><!--\r\ngoogle_ad_client = \"ca-pub-5825700137064158\";\r\n\/* 250sq, appsweets-blog *\/\r\ngoogle_ad_slot = \"4837931762\";\r\ngoogle_ad_width = 250;\r\ngoogle_ad_height = 250;\r\n\/\/-->\r\n<\/script>\r\n<script type=\"text\/javascript\"\r\nsrc=\"http:\/\/pagead2.googlesyndication.com\/pagead\/show_ads.js\">\r\n<\/script>\n<\/div>\n<p>Firefox + Add-on SDK \u3067 \u6700\u7d42\u7684\u306b .xpi \u30d5\u30a1\u30a4\u30eb\u3092\u30d3\u30eb\u30c9\u3059\u308b\u306b\u306f\u3001<br \/>\n<code lang=\"bash\"><br \/>\n$ cfx xpi --pkgdir=\/path\/to\/package --update-link=http:\/\/path\/to\/update-link --update-url=http:\/\/path\/to\/update-url<br \/>\n<\/code><br \/>\n\u306a\u3069\u3068\u3059\u308b\u3002<\/p>\n<p>cfx \u306f\u3001\u30a8\u30af\u30b9\u30c6\u30f3\u30b7\u30e7\u30f3\u3092\u69cb\u6210\u3059\u308b\u30d5\u30a1\u30a4\u30eb\u3068\u3001Add-on SDK \u304c\u63d0\u4f9b\u3059\u308b\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u304b\u304d\u96c6\u3081\u3066 .xpi \u30d5\u30a1\u30a4\u30eb\u3092\u751f\u6210\u3059\u308b\u3002\u5f8c\u8005\u306f\u3001\u4f4e\u4f4d\u306a\u30e9\u30a4\u30d6\u30e9\u30ea api-utils \u3068\u9ad8\u4f4d\u306a addon-kit \u306e 2 \u7a2e\u985e\u3042\u308b\u306e\u3060\u304c\u3001addon-kit \u306b\u95a2\u3057\u3066\u306f\u30a8\u30af\u30b9\u30c6\u30f3\u30b7\u30e7\u30f3\u304c\u53c2\u7167\u3057\u3066\u3044\u308b\u3082\u306e\u3060\u3051\u3092\u62bd\u51fa\u3057\u3066\u3001.xpi \u306e\u30b5\u30a4\u30ba\u306e\u80a5\u5927\u5316\u3092\u9632\u3044\u3067\u3044\u308b\u3002\u306a\u304b\u306a\u304b\u8ce2\u3044\u3067\u3059\u306d\u3002<\/p>\n<p>\u305f\u3060\u3001\u3069\u3046\u3084\u3063\u3066\u30a8\u30af\u30b9\u30c6\u30f3\u30b7\u30e7\u30f3\u304c\u53c2\u7167\u3057\u3066\u3044\u308b addon-kit \u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u629c\u304d\u51fa\u3057\u3066\u3044\u308b\u306e\u304b\u3068\u3044\u3046\u3068\u3001$(addon-sdk)\/python-lib\/cuddlefish\/manifest.py \u306e\u4e2d\u3067\u3001javascript \u30bd\u30fc\u30b9\u3092\u6b63\u898f\u8868\u73fe\u30ec\u30d9\u30eb\u3067\u8d70\u67fb\u3057\u3066\u3044\u308b\u3002<br \/>\n<code lang=\"python\"><br \/>\nREQUIRE_RE = r\"(?<![\\'\\\"])require\\s*\\(\\s*[\\'\\\"]([^\\'\\\"]+?)[\\'\\\"]\\s*\\)\"\n<\/code><br \/>\n\u3068\u3044\u3046\u6b63\u898f\u8868\u73fe\u3067\u3001\u307e\u3055\u306b grep \u3057\u3066\u3044\u308b\u3002javascript \u306e\u69cb\u6587\u89e3\u6790\u3092\u3057\u3066\u3044\u308b\u308f\u3051\u3067\u306f\u306a\u3044\u3002<\/p>\n<p>\u3053\u308c\u304c\u3053\u3046\u306a\u3063\u3066\u3044\u308b\u306e\u306f\u3001\u3064\u307e\u308a\u3053\u308c\u3067\u305f\u3044\u3066\u3044\u306e\u5834\u5408\u826f\u3044\u3060\u308d\u3046\u3068\u3044\u3046\u3053\u3068\u306a\u3093\u3060\u3068\u601d\u3046\u304c\u3001\u305d\u3046\u3067\u3082\u306a\u3044\u5834\u5408\u3082\u3042\u308b\u3002wasavi \u306e\u30d1\u30c3\u30b1\u30fc\u30b8\u306f js \u30d5\u30a1\u30a4\u30eb\u3092 minify \u3057\u3066\u3044\u308b\u3002\u3064\u307e\u308a\u30d1\u30c3\u30b1\u30fc\u30b8\u5185\u306e javascript \u30bd\u30fc\u30b9\u306f\u3082\u306e\u3059\u3054\u304f\u9577\u3044 1 \u884c\u306e\u30c6\u30ad\u30b9\u30c8\u306a\u306e\u3060\u3002\u3053\u308c\u304c\u6839\u672c\u7684\u306a\u539f\u56e0\u3060\u3068\u601d\u3046\u306e\u3060\u3051\u3069\u3001\u53c2\u7167\u3057\u3066\u3044\u308b\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u629c\u304d\u51fa\u3057\u304c\u3046\u307e\u304f\u884c\u3063\u305f\u308a\u884c\u304b\u306a\u304b\u3063\u305f\u308a\u3059\u308b\uff08\u305f\u3044\u3066\u3044\u306f\u3046\u307e\u304f\u884c\u304b\u306a\u3044\uff09\u3002<\/p>\n<p>minify \u3057\u306a\u3051\u308a\u3083\u3044\u3044\u3058\u3083\u3093\u3068\u3044\u3046\u6c17\u3082\u3059\u308b\u304c\u3001\u3082\u3057\u304b\u3057\u305f\u3089\u5c06\u6765 closure compiler \u3092\u4f7f\u3046\u304b\u3082\u3057\u308c\u306a\u3044\u306e\u3067\u3084\u3063\u3071\u308a cfx \u5074\u304c\u5909\u5247\u7684\u306a javascript \u30bd\u30fc\u30b9\u306b\u3082\u5bfe\u5fdc\u3057\u3066\u3082\u3089\u3063\u305f\u307b\u3046\u304c\u3044\u3044\u306e\u3067\u306f\u306a\u3044\u304b\u3068\u601d\u3046\u3002<\/p>\n<p>\u3068\u308a\u3042\u3048\u305a\u306e\u56de\u907f\u7b56\u3068\u3057\u3066\u3053\u3046\u3057\u3066\u3044\u308b:<\/p>\n<ul>\n<li>\u30a8\u30af\u30b9\u30c6\u30f3\u30b7\u30e7\u30f3\u3067\u53c2\u7167\u3057\u3066\u3044\u308b\u3059\u3079\u3066\u306e\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u5185\u90e8\u7684\u306b require \u3059\u308b\u30c0\u30df\u30fc\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u4f5c\u308b\u3002lib\/dummy-require.js \u3068\u304b\u3002<br \/>\n<code lang=\"javascript\"><br \/>\nvar self        = require('self');<br \/>\nvar pageMod     = require('page-mod');<br \/>\nvar tabs        = require('tabs');<br \/>\nvar simplePrefs = require('simple-prefs');<br \/>\nvar clipboard   = require('clipboard');<br \/>\nvar timers      = require('timers');<\/p>\n<p>var locale      = require('api-utils\/l10n\/locale');<br \/>\nvar xhr         = require('api-utils\/xhr');<\/p>\n<p>exports.hello = function () {<br \/>\n\treturn 'it is dummy module';<br \/>\n}<br \/>\n<\/code><br \/>\n\u3053\u306e\u30bd\u30fc\u30b9\u3060\u3051\u306f\u3001minify \u3057\u306a\u3044\u3002\n<\/li>\n<li>\n\u4ed6\u306e javascript \u30bd\u30fc\u30b9\u306e\u3069\u308c\u304b 1 \u3064\u3067\u3001\u4e0a\u8a18\u306e\u30bd\u30fc\u30b9\u3092 require \u3059\u308b\u3002\u30bd\u30fc\u30b9\u306e\u3067\u304d\u308b\u3060\u3051\u5148\u982d\u306e\u65b9\u304c\u3044\u3044\u304b\u3082\u3057\u308c\u306a\u3044\u3002main.js \u3042\u305f\u308a\u306e\u5148\u982d\u3067:<br \/>\n<code lang=\"javascript\"><br \/>\nif (typeof window == 'undefined') {<br \/>\n\twindow = this;<br \/>\n\twindow.jetpack = {};<br \/>\n\trequire('.\/dummy-require');<br \/>\n}<br \/>\n<\/code><br \/>\n\u306e\u3088\u3046\u306a\u611f\u3058\u3002require \u3059\u308b\u3060\u3051\u3067\u3001\u5225\u306b\u4f55\u304b\u306b\u4f7f\u3063\u305f\u308a\u3059\u308b\u308f\u3051\u3067\u306f\u306a\u3044\u3002<\/p>\n<p>\u3053\u306e\u72b6\u614b\u3067 cfx xpi \u3059\u308b\u3068\u3001\u5fc5\u8981\u306a\u30e9\u30a4\u30d6\u30e9\u30ea\u304c\u6b63\u78ba\u306b\u629c\u304d\u51fa\u3055\u308c\u308b\u3088\u3046\u3060\u3002<\/p>\n<p>\u3046\u30fc\u3093\u307e\u3042\u5272\u3068\u3069\u3046\u3067\u3082\u3044\u3044 tips \u3060\u306a\uff01<\/p>\n<div class=\"856f7bdf6ce2541193600c6e03dd1a56\" data-index=\"1\" style=\"float: left; margin: 16px 16px 16px 0;\">\n<script type=\"text\/javascript\"><!--\r\ngoogle_ad_client = \"ca-pub-5825700137064158\";\r\n\/* 250sq, appsweets-blog *\/\r\ngoogle_ad_slot = \"4837931762\";\r\ngoogle_ad_width = 250;\r\ngoogle_ad_height = 250;\r\n\/\/-->\r\n<\/script>\r\n<script type=\"text\/javascript\"\r\nsrc=\"http:\/\/pagead2.googlesyndication.com\/pagead\/show_ads.js\">\r\n<\/script>\n<\/div>\n\n<div style=\"font-size: 0px; height: 0px; line-height: 0px; margin: 0; padding: 0; clear: both;\"><\/div>","protected":false},"excerpt":{"rendered":"<p>Firefox + Add-on SDK \u3067 \u6700\u7d42\u7684\u306b .xpi \u30d5\u30a1\u30a4\u30eb\u3092\u30d3\u30eb\u30c9\u3059\u308b\u306b\u306f\u3001 $ cfx xpi &#8211;pkgdir=\/path\/to\/package &#8211;update-link=http:\/\/path\/to\/update-link &#8211;update-url=http:\/\/path\/to\/update-url \u306a\u3069\u3068\u3059\u308b\u3002 cfx \u306f\u3001\u30a8\u30af\u30b9\u30c6\u30f3\u30b7\u30e7\u30f3\u3092\u69cb\u6210\u3059\u308b\u30d5\u30a1\u30a4\u30eb\u3068\u3001Add-on SDK \u304c\u63d0\u4f9b\u3059\u308b\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u304b\u304d\u96c6\u3081\u3066 .xpi \u30d5\u30a1\u30a4\u30eb\u3092\u751f\u6210\u3059\u308b\u3002\u5f8c\u8005\u306f\u3001\u4f4e\u4f4d\u306a\u30e9\u30a4\u30d6\u30e9\u30ea api-utils \u3068\u9ad8\u4f4d\u306a addon-kit \u306e 2 \u7a2e\u985e\u3042\u308b\u306e\u3060\u304c\u3001addon-kit \u306b\u95a2\u3057\u3066\u306f\u30a8\u30af\u30b9\u30c6\u30f3\u30b7\u30e7\u30f3\u304c\u53c2\u7167\u3057\u3066\u3044\u308b\u3082\u306e\u3060\u3051\u3092\u62bd\u51fa\u3057\u3066\u3001.xpi \u306e\u30b5\u30a4\u30ba\u306e\u80a5\u5927\u5316\u3092\u9632\u3044\u3067\u3044\u308b\u3002\u306a\u304b\u306a\u304b\u8ce2\u3044\u3067\u3059\u306d\u3002 \u305f\u3060\u3001\u3069\u3046\u3084\u3063\u3066\u30a8\u30af\u30b9\u30c6\u30f3\u30b7\u30e7\u30f3\u304c\u53c2\u7167\u3057\u3066\u3044\u308b addon-kit \u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u629c\u304d\u51fa\u3057\u3066\u3044\u308b\u306e\u304b\u3068\u3044\u3046\u3068\u3001$(addon-sdk)\/python-lib\/cuddlefish\/manifest.py \u306e\u4e2d\u3067\u3001javascript \u30bd\u30fc\u30b9\u3092\u6b63\u898f\u8868\u73fe\u30ec\u30d9\u30eb\u3067\u8d70\u67fb\u3057\u3066\u3044\u308b\u3002 REQUIRE_RE = r&#8221;(?<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[5,3,4],"class_list":["post-272","post","type-post","status-publish","format-standard","hentry","category-uncategorized","tag-javascript","tag-vi","tag-wasavi"],"_links":{"self":[{"href":"http:\/\/appsweets.net\/blog\/wp-json\/wp\/v2\/posts\/272","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/appsweets.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/appsweets.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/appsweets.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/appsweets.net\/blog\/wp-json\/wp\/v2\/comments?post=272"}],"version-history":[{"count":2,"href":"http:\/\/appsweets.net\/blog\/wp-json\/wp\/v2\/posts\/272\/revisions"}],"predecessor-version":[{"id":274,"href":"http:\/\/appsweets.net\/blog\/wp-json\/wp\/v2\/posts\/272\/revisions\/274"}],"wp:attachment":[{"href":"http:\/\/appsweets.net\/blog\/wp-json\/wp\/v2\/media?parent=272"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/appsweets.net\/blog\/wp-json\/wp\/v2\/categories?post=272"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/appsweets.net\/blog\/wp-json\/wp\/v2\/tags?post=272"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}