色々なアプリを作るときに、Electronではnpmのモジュールが使えるのであまり困ることはないのだけれど、どうしても実行速度や作る時間の問題で、既存のexe等を使いたいときがある。
外部に配置したexeを指定することは、パスの指定諸々とてもめんどくさいので、アプリケーション内部に配置して実行できるかなと思って、exeファイルをchild_process
のexec()
で動かしてみたらうまく実行できた。
安心して進めていたら、パッケージ化した後にどうにも動かなくなって困った。
ぐぐってみたら、パッケージングを行うときにasar
形式でアーカイブしていたため、exec()
やspawn()
では動かないみたいだった。(参照「Executing a script as a child_process.exec inside an asar archive #3512 - GitHub/electron」、「アプリケーションのパッケージ化 - GitHub/electron」)
▼ execFile()
を使ったら動いた。
const remote = require('electron').remote;
const app = remote.app;
// アプリ内部のパスを取得する
const path:string = app.getAppPath();
console.log(path);
// ファイルを実行する
const exec = require('child_process').execFile;
exec( path + "/実行ファイルまでのパス", ["オプション"],
function(err:any, stdout:any, stderr:any){
}
);
※ OSX El Capitan 10.11.5、Electron 1.2.1で試しました。
以上。