Electronアプリから外部アプリを起動する際に困った件
Electronのアプリを作成する機会が先日ありました。
内容はとても簡単で、外部のアプリケーションを複数起動するというものでした。
Electronから外部起動する命令は下記のとおりです。
1 2 3 |
require('electron').shell.openExternal("C:\\TEST.exe"); |
これで指定したアプリを起動させることができます。
起動自体は問題なかったのですが、今回の外部アプリケーションは設定ファイルが出力されるタイプのものでした。
その設定が、Electronのアプリから起動した場合に初期化されてしまうという謎の現象が発生してしまったのです。
何故初期化されてしまったのか
原因を探るために調査を開始しました。
Electronアプリからの外部アプリ起動には複数パターンあります。
1つは require('electron').shell.openExternalを使う方法。
もう一つは require('child_process').execを使う方法などがあります。
これらはアプリケーションをキックするだけ(ダブルクリックするだけ)で、普通に呼び出す分には起動に関して特殊なことをしていません。
起動に差がないのであれば、環境に差があるはず、と推測して調査をしてたところ Electronアプリの中に見慣れないファイル が生成されていることに気づきました。
中身を見てみると、それは 外部アプリが作成している設定ファイル だったのです。
原因と対応
上記の調査の結果 外部アプリが生成するファイルは相対パスで出力されていた と分かりました。
つまり Electronアプリが外部アプリを起動した場合、相対パスの基点はElectronアプリのexeの場所になる ということです。
原因がわかれば対応は簡単。
外部アプリは当然手が出せませんので、基点とする場所を変更することで対応していきます。
具体的には下記のとおりです。
1 2 3 4 5 6 7 8 9 10 11 12 |
// Windowsの場合 const exec = require('child_process').exec; var command = 'CD '+EXE_PATH+' && TEST.exe'; exec(command, (error, stdout, stderr) => { if(error) { console.log(error); console.log(stdout); console.log(stderr); } }); |
ポイントは4行目のところ。
CDコマンドで外部アプリの場所まで移動をしてから、対象のアプリケーションを起動する コマンドになっています。
これにより、基点を外部アプリのexeがある場所に変更が可能です。
さいごに
本当は起動している外部アプリの方を治すのが正しいとは思いますし、本来ならそうすべきだと思います。
ただ、作りが甘く、きれいにできているアプリばかりではないのもまた事実ですので、今回みたいな起動方法を取りました。
Electronアプリを開発している人が少しでも楽になりますように。
- おすすめ記事
POPULAR
のえる
Full-stack Developer