【Electron】VSCodeを起動してファイルを開く
準備
preload.jsを有効にする
webPreferences内にsandbox: falseを記述すること
概要
Node.jsの組み込みモジュール「child_process」を使ってシェルコマンドを実行する
シェルコマンドは「起動するアプリケーション 開くファイル」の形で入力するとその通りに実行する
ただしアプリケーションによっては設定ファイルの出力場所が相対パスになっていることで予期しない挙動になる可能性があるため、カレントディレクトリを予め移動する必要が生じることがある
今回はVSCodeを想定しているのでこのための処理はしない
VSCodeは、インストールされていれば「Code」だけで起動できるようにパスが通っていると思われるので(フルパスを書かなくても「Code.exe」の在り処を探してくれるので「Code」だけでVSCodeのことだとシェルが理解してくれる)、「Code hoge.txt」のような形でchild_process.exec()の引数に代入すれば開くことができる
preload.jsにcontextBridgeでメソッドを作る
code:preload.js
const {contextBridge} = require('electron');
const child_process = require('child_process');
contextBridge.exposeInMainWorld('myapi', {
// 「myapi」の部分は自由に設定可
openApp(appPath,filePath){
const command = ${appPath} ${filePath};
child_process.exec(command,(error,stdout,stderr)=>{
if(error){
console.log(error);
console.log(stdout);
console.log(stderr);
}
})
console.log(${appPath}で\n${filePath}を開きました。);
}
})
※わかりやすいようにmyapi.openApp(アプリケーション,ファイル)の形にしているが、単にコマンドを渡すようにしてその都度コマンドの文字列を作ってもいいと思う(その方が汎用性がある)
code:js
// 汎用バージョン
contextBridge.exposeInMainWorld('myapi', {
execCommand(command){
child_process.exec(command,(error,stdout,stderr)=>{
if(error){
console.log(error);
console.log(stdout);
console.log(stderr);
}
})
}
})
レンダラープロセス(HTMLに読み込むjs)でメソッドを呼び出す
code:script.js
myapi.openApp('Code','hoge.json');
// "src/data/hoge.json"をVSCodeで開ける
// ファイルをフルパスで渡せばどのファイルでも開ける
// 汎用バージョンならmyapi.execCommand('Code hoge.json')
多分理解度が低い状態で当てずっぽうにやると危ないタイプのメソッド