asarのパッケージにはマルチバイト文字を含むファイルを含められない

Electronで作ったアプリケーションをasarでパケージングしようとしてハマったのでメモ。
asarのパッケージにはマルチバイト文字を含むファイルを含められない。
大体次のようなディレクトリ構成になっていた。

KNameCards/
  + BasicScripts.js
  + config.json
  + index.html
  + main.js
  + package.json
  + NameCards.json
  + NameCardsのコピー.json
  + css/

で、これを「asar」でパッケージする。
$ asar pack Pacakge Package.asar

パッケージ自体は作成される。
が、Electronで実行しようとすると「妥当なモジュールではない」と怒られる。
訳がわからないのでパッケージの内容をリスト表示しようとするとエラーになった。
$ asar list Package.asar
{"files":{".DS_Store":{"size":6148,"offset":"0"},"BaseScript.js":{"size":19320,"offset":"6148"},"config.json":{"size":229,"offset":"25468"},"css":{"files":{"default.css":{"size":2955,"offset":"25697"}}},"index.html":{"size":2695,"offset":"28652"},"main.js":{"size":5107,"offset":"31347"},"NameCards のコピー.json":{"size":14596,"offset":"36454"},"NameCards.json":{"size":14830,"offset":"51050"},"package.json":{"size":230,"offset":
^

SyntaxError: Unexpected end of input
at Object.parse (native)
at Object.module.exports.readArchiveHeaderSync (/usr/local/lib/node_modules/asar/lib/disk.js:97:20)
at Object.module.exports.readFilesystemSync (/usr/local/lib/node_modules/asar/lib/disk.js:105:21)
at Object.module.exports.listPackage (/usr/local/lib/node_modules/asar/lib/asar.js:99:17)
at Command. (/usr/local/lib/node_modules/asar/bin/asar:40:23)
at Command.listener (/usr/local/lib/node_modules/asar/node_modules/commander/index.js:249:8)
at emitTwo (events.js:87:13)
at Command.emit (events.js:172:7)
at Command.parseArgs (/usr/local/lib/node_modules/asar/node_modules/commander/index.js:480:12)
at Command.parse (/usr/local/lib/node_modules/asar/node_modules/commander/index.js:372:21)

原因はテストしている時に作っていた「NameCardsのコピー.json」で、これを削除したらきちんと実行可能なパッケージができた。
どうも、パッケージにマルチバイト文字を含むファイル名があるとasarのパッケージのパースに失敗するらしい。
スポンサーサイト

メニューからレンダラプロセスの関数を呼ぶ

Electronでプログラムを書いていてやり方を調べるのにちょっと苦労したのでメモ。
メニューに追加した項目からレンダラプロセス側で定義したfunctionを呼ぶためにはプロセス間通信の仕組みを使う必要がある。

【index.html】
※ save()はどこかに定義しておく必要あり。
例えば、
function save(){
    alert("clicked");
}
みたいにして確認できる。

「var ipc = electron.ipcRenderer;」のところでプロセス間通信用のオブジェクトを取得する。
「ipc.on('メッセージ', function);」でメッセージを受けた時の処理を書く。

【main.js】

「click: function () { mainWindow.webContents.send('save') }」のところ。
メニュー項目クリック時に動作するfunctionでレンダラプロセスにメッセージを送る。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。