-
Notifications
You must be signed in to change notification settings - Fork 305
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
ファイル保存全般をアトミックにする #2308
ファイル保存全般をアトミックにする #2308
Conversation
ビルドに失敗してますね... |
src/helpers/fileHelper.ts
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
fileHelper.ts
はレンダラープロセスで使用されています。
そのためnodeAPI(fs
やmove-file
)をインポートするとバンドルに失敗してビルドが失敗しているのではないかと思います。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
webアプリ全般に詳しくなく、見当がついていない状況だったので、レビュー大変助かります!
fileHelper.tsはレンダラープロセスで使用されています。
そのためnodeAPI(fsやmove-file)をインポートするとバンドルに失敗してビルドが失敗しているのではないかと思います。
なるほどです。であれば、追加するヘルパー関数はsrc/backend/electron
以下に別途ファイルを作るなどして、メインプロセスからのみ使用するファイルに記載する必要がありそうですね。
メインプロセス、レンダラープロセスについて理解していない部分があるので、調べつつ修正してみます!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
あっ!!! なるほど、すみませんでした!!!!
とりあえず一旦の解決策としては、electron用のディレクトリにヘルパー関数を置くのが良さそうだと思います!!
(と言おうとしたら既にそう提案されてますね!!! 非常に良いと思います!!!)
ちなみに取っ掛かりとしてelectronの仕組みをちょっとだけご説明すると。
electronはchromiumブラウザでGUIを表示するプロセス(レンダラー側)と、あとはそのGUIを起動したり、ブラウザではできないことをする用のメインプロセスに分かれていて、ファイル操作はメインプロセスじゃないとできないようになっている感じです!
なのでレンダラー側からファイル操作の処理をimportしたときに、そんなものがないのでエラーになる感じかなと・・・!!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
お気になさらず…!むしろ、勉強になってよかったなと
electronについても教えていただき、ありがとうございます!
修正してみるので、お待ちいただければです!
修正してみました! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM!!!
実装ありがとうございます、良さそう!!
ちょっとこっちでいくつか調整させていただこうと思います!
非同期なfs.promises.writeFile
を使っていますが、場合によってはasyncを使わなくても実行できるコードの方が嬉しそうなので、同期実行する関数の方に変えさせていただこうと思います!
src/backend/electron/fileHelper.ts
Outdated
const temp_path = `${path}.tmp`; | ||
await fs.promises.writeFile(temp_path, data); | ||
|
||
await moveFile(temp_path, path, { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
あ、これ元コードで気づかなかったけどsnake_caseになってますね!
ちょっとついでにcamelCaseに直しちゃえると!!
const temp_path = `${path}.tmp`; | |
await fs.promises.writeFile(temp_path, data); | |
await moveFile(temp_path, path, { | |
const tempPath = `${path}.tmp`; | |
await fs.promises.writeFile(tempPath, data); | |
await moveFile(tempPath, path, { |
src/backend/electron/fileHelper.ts
Outdated
export async function writeFileSafely( | ||
path: string, | ||
data: string | NodeJS.ArrayBufferView, | ||
) { | ||
// ファイル書き込みに失敗したときに設定が消えないように、tempファイル書き込み後上書き移動する |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
コメントはこう書いておくと、VSCodeで関数をマウスオーバーした時にドキュメントが表示されてちょっと便利だったりします!
/** ファイル書き込みに失敗したときに設定が消えないように、tempファイル書き込み後上書き移動する */
export async function writeFileSafely( | |
path: string, | |
data: string | NodeJS.ArrayBufferView, | |
) { | |
// ファイル書き込みに失敗したときに設定が消えないように、tempファイル書き込み後上書き移動する | |
export async function writeFileSafely( | |
path: string, | |
data: string | NodeJS.ArrayBufferView, | |
) { |
あっとすみません!
|
ああ、こちらリポジトリの設定でお手数をお掛けしてすみません! |
の3点を修正してみました! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM!!!
調整ありがとうございました!!!
プルリクエストもありがとうございました!
もしよかったらまたプルリクエストお待ちしています!!
分からないことがあったらお気軽に聞いてください!
ファイル保存全般をアトミックにする
@RikitoNoto さんが #2098 で作成してくださったファイル保存を
src/helpers/fileHelper.ts
にヘルパー関数として切り出しました。上記のファイルはレンダラープロセスからも参照されるため、
src/backend/electron/fileHelper.ts
にヘルパー関数として切り出しました。それに伴い、
src/backend/electron/electronConfig.ts
のElectronConfigManager.save
src/backend/electron/main.ts
のWRITE_FILE
部分src/backend/electron/manager/RuntimeInfoManager.ts
のexportFile
関数のファイル保存処理をヘルパー関数で置き換えました。
それぞれ、
設定/ツールバーのカスタマイズ
から設定を変更し、保存ボタンを押した時にwriteFileSafelyのmoveFile呼び出しの前でelectronを停止したときにtmpファイルが存在しており、electronを再起動してファイルが正しく開ける/正しく起動できることを確認しました。
関連 Issue
ref #2103 #2098
close #2103
その他
src/backend/electron/main.ts
のWRITE_FILE
部分を非同期関数に変えてしまったのですが、こちらで問題ないでしょうか?