Skip to content
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

feat: Windowsのアンインストーラーでインストールしたエンジンを削除できるようにする #1518

Merged
merged 13 commits into from
Sep 17, 2023

Conversation

sabonerune
Copy link
Contributor

@sabonerune sabonerune commented Aug 22, 2023

内容

Wndowsのアンインストーラーで設定ディレクトリを削除することで設定とインストールしたVVPPエンジンを削除できるようにします。

関連 Issue

既に使用していないUI

スクリーンショット・動画など

アンインストーラー

その他

いくつか削除できないものがあります。

  • 辞書等のエンジン側の設定ファイル(VOICEVOXでは%LOCALAPPDATA%voicevox-engine
  • すべてのユーザー用にインストールした場合アンインストールしたユーザー以外の設定・エンジン

議論が必要と思われる点

  • すべてのユーザー用にインストールした場合、削除するべきではないかもしれない。
    特に中途半端に削除すると完全に削除したと勘違いさせるリスクがある。
  • electron-builder.config.js.env.productionから環境変数を読み込んでいるが他のファイルからも読み取るべきか?

@sabonerune sabonerune requested a review from a team as a code owner August 22, 2023 09:58
@sabonerune sabonerune requested review from y-chan and removed request for a team August 22, 2023 09:58
@Hiroshiba
Copy link
Member

  1. アンインストール時に間違えて設定を消せてしまうのは避けたいです。
    例えば、なんか動かないからアンインストール+インストールを試そうとして、間違えてプリセット含む全設定を消しちゃったらもう起動されない気がするので・・・。
    あとまあ、軽いので。
  2. 大体のユーザーはVVPPという文字をここで初めて見るので、何を聞かれているのかわからない気がしますね。。
    追加エンジンインストール済みの人だけに案内できるならそうして、できないなら聞くことすらしない方が良いのかなというのが正直な気持ちです。

これどうすべきか本当に迷っているのですが、そもそもアプリアンインストール時にプラグインは消去されるべきなんでしょうか。。。
たぶんボイロ・アイボスは追加ライブラリは別アプリ認識だから一緒にアンインストールされないはずです。
voicepeak・CeVIOはどうなってるんでしょう。。

@sabonerune
Copy link
Contributor Author

個人的な考えとしては%USERPROFILE%\AppData\以下のファイルは一般的なユーザーは触るべきではない(もしくは触ろうとすら考えない)領域と思っています。
自分が削除できるようにするべきであると考える理由は起動できない等の問題が起きた場合多くのユーザーが試すのはアプリの再インストールだと思うからです。
設定ファイル周りのエラーであった場合、設定を削除できればそこで解決できるはずです。

たぶんボイロ・アイボスは追加ライブラリは別アプリ認識だから一緒にアンインストールされないはずです。

ボイロ・アイボスは音声ライブラリそれぞれがPCにインストールされるソフトウエアだからそのようになっていると思います。
(そういえばアイボスの辞書ファイルはドキュメントに保存されています。)

Windows アプリケーション開発 - ベスト プラクティス

とはいえ全部削除してしまうのはあまり良くないかもしれませんね…

@Hiroshiba
Copy link
Member

設定ファイルが原因の場合に問題が解決するというのは、それはそうなのですが、やはり誤って消してしまうことを防ぎたい気持ちが強めです。

Windowsのベストプラクティス、なるほどです。このようなことが書かれていました。

アプリケーションをアンインストールするときに、データを保持するオプションをユーザーに提供することを検討してください。

ちょっと可能かどうかわからないのですが、アンインストーラーを起動してすぐに、デフォルトがオフの「設定ファイルも削除する」と、デフォルトがオンの「追加エンジンを削除する」などのチェックボックスを表示し、ボタンとして「アンインストール」「キャンセル」などがあるようなダイアログを表示するとかはどうでしょうか。
イメージとしてはインストールが完了したときに現れる「一時ファイルを消去する」みたいなチェックボックスの感じです。

@sabonerune
Copy link
Contributor Author

アンインストール前に差し込めそうなフックはありませんでしたが、アンインストール完了後に差し込めそうなフックはありました。
https://github.com/electron-userland/electron-builder/blob/445b7f5d066781f3938fd6bcaca1d9a12f5b0eeb/packages/app-builder-lib/templates/nsis/assistedInstaller.nsh#L74

とりあえずそこで削除できるか試してみます。

@Hiroshiba
Copy link
Member

なるほどです!!
多分インストーラー側にもある機構ですよね。ここでできるととても良さそう・・・!

@sabonerune
Copy link
Contributor Author

とりあえずページを追加してみました。

  1. アンインストールの処理(従来のまま)
    アンインストール

  2. 削除する項目を選択
    削除するファイルを選択するページ

  3. 最後の確認
    確認ダイアログ

  4. 完了ページ(従来のまま)
    完了ページ

@Hiroshiba
Copy link
Member

@sabonerune すごく良さそうに感じました!!!!! 色々ありがとうございます!!!

追加エンジンの削除は割と気軽に再インストール可能なので、再確認ダイアログはなくせるかもと思いました(デフォルトでオンですし)。
チェックボックスの上を「全ての設定ファイルを削除する」、下を「追加エンジンのみ削除する」にして、上のチェックボックスがオンになっている時のみ「全ての設定ファイルを削除します。本当によろしいでしょうか。」のような内容にするとUX的に緊張感を減らせていいのかなとちょっと思いました・・・!
(議論の余地があるかも)

@sabonerune
Copy link
Contributor Author

とりあえずそのように変更しました。
試しているときに気づいたのですがエンジンのファイルが大きいと削除に時間がかかりUIが応答なしになってしまうようです。

Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

試しているときに気づいたのですがエンジンのファイルが大きいと削除に時間がかかりUIが応答なしになってしまうようです。

なるほどです・・・!! これは結構しょうがないのかなと思いました。


設定ディレクトリを吹き飛ばすの、かなり怖いなと思いました・・・。理由が2点あります。

別でコメントした通り、環境変数などの指定を間違えていたりすると、その親ディレクトリを吹き飛ばしてしまう可能性があるためです。
まあでもこれは結構気をつけることによって避けられるのではとはちょっと思ってます。

もう一つが、将来的に設定ディレクトリに別の何かを保存する可能性もあって、設定ディレクトリが消去される可能性があるのがWindowsのみになっているため、何か問題があったりすることに気づきにくいというのがありそうです。

なので全部の設定ディレクトリを吹き飛ばすのはやめて、ホワイトリスト形式で吹き飛ばすのはどうでしょうか。
具体的には今目的としているのが設定ファイルの消去とvvpp-enginesディレクトリの消去だと思うので、その2つだけにするのが良いのかなと感じました。

(この辺り手探りで進めている状況もあって、何度も変更お願いしてしまって本当に申し訳ないです・・・。 🙇 )

build/installer.nsh Outdated Show resolved Hide resolved
Comment on lines 828 to 833
${NSD_CreateCheckBox} 0 0 100% 12u "全ての設定ファイルを削除する"
Pop $removeAllUserDataCheckBox

${NSD_CreateCheckBox} 0 13u 100% 12u "追加エンジンのみ削除する"
Pop $removeAdditionalEngineCheckBox
${NSD_Check} $removeAdditionalEngineCheckBox
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ちなみになのですが、該当ディレクトリがあった場合のみこのチェックボックスを表示する(あるいはdisable/enableを制御する)とかって可能そうでしょうか・・・?
というのも9割9分の人はこのチェックボックスの意味がわからないので、意識から外してあげるとUXが向上するのかなとか思った次第です。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

%APPDATA%/voicevoxがないというのは「インストールはしたが一度も起動したことがない」しか思いつかないですね…
ただ、簡単に処理できそうです。

問題はエンジンの方で起動時に自動的に%APPDATA%/voicevox/vvpp-enginesが作成されます。
また、一度でも追加操作をすると.tmpディレクトリが作成されるのでそれが空であるかも確認が必要で結構コードが複雑になる気がします。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

%APPDATA%/voicevox/vvpp-enginesの中身が空の.tmpディレクトリ以外がない場合は追加エンジンのみ削除するのチェックボックスが無効化されるようにしました。

また、%APPDATA%\voicevoxが空のエンジンディレクトリ以外存在しない場合(または存在しない場合)はページ自体をスキップするようにしました。

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ありがとうございます、すごく良い仕様だと思います!!

VvppManager側の追加エンジンの仕様が変わると、追加エンジン有無の判定ロジックがバグってしまうことに気づきました。
一番確実なのはアンインストーラーのテストを書くことですが、ちょっと現実的ではなさそうに思います 😇
なのでVvppManager側のテストとして、この追加エンジンの判定ロジックと同様のものを実装し、変わってないことを保証し、変わってしまったことを検知したらアンインストーラーのここの処理も変更する必要があることを開発者に知らせるというのはどうでしょう・・・?

とはいえVvppManagerのテストは存在せず、かつ他のユニットテストの実装すらないので、実装するのはちょっとだけ難しいかもしれません。
もしできそうであれば挑戦してみて、難しそうであればとりあえずVvppManager側の追加エンジンディレクトリ周りにFIXMEコメントを書く、というのはどうでしょう 🙇

@sabonerune
Copy link
Contributor Author

なので全部の設定ディレクトリを吹き飛ばすのはやめて、ホワイトリスト形式で吹き飛ばすのはどうでしょうか。
具体的には今目的としているのが設定ファイルの消去とvvpp-enginesディレクトリの消去だと思うので、その2つだけにするのが良いのかなと感じました。

削除してもよいファイルやディレクトリを一つずつ削除していきディレクトリが空なら削除するような感じでしょうか?
それなら比較的安全に削除できると思います。

ただ、Chromiumが生成するsessionDatauserDataと同じディレクトリに設定されているためそれを安全に始末することが難しそうです。
自分の把握する限りではこれらのファイル群に設定等はほぼ保存されていないため消してしまっても問題なさそうです。(DevToolの設定くらい?)

app.getPath(name)

sessionData localStorage、Cookie、ディスクキャッシュ、ダウンロードした辞書、ネットワーク状態、デベロッパー ツールのファイルなど、Session で生成したデータを保存するディレクトリです。 既定ではこれは userData を指します。 Chromium はここに非常に大きなディスクキャッシュを書き込む可能性があるため、ユーザーデータの保存を localStorage や Cookie などのブラウザストレージに依存しないアプリの場合、userData ディレクトリを汚染しないよう、このディレクトリを他の場所に設定することが推奨されます。

sessionDataのファイルサイズは結構ばらつきがあるような感じです(手元の他のエディタも見て10~200MB程度?)

思いついたのが

  • 削除せず放置
  • 分かっているディレクトリとファイルを削除
  • 0.15でディレクトリを移動してそれを消去0.14はそのまま放置する

ですね。

どれもあまりいい気がしませんが。

@Hiroshiba
Copy link
Member

削除してもよいファイルやディレクトリを一つずつ削除していきディレクトリが空なら削除するような感じでしょうか?

あ、目的が「追加エンジンの消去」と「設定ファイルの消去」だと考えていたので、これら2つだけをホワイトリスト形式で削除することを考えていました!

思いついたのが

一旦削除せず放置が安定なのかなと思いました。
他のアプリも消去せず放置している現状だと思うので、100MB程度の容量が残るのはそこまで問題ではないと考えています。

electronでlocalStorageCookieを明示的に使えなくできれば、ディレクトリを移動してしまうのもありな気がしました!
確かブラウザ版はlocalStorageを使用しているので、browserディレクトリ以外でこの辺りの関数やらを使うとESLintでエラーが出るようにすれば行けそう・・・?

とりあえずこちらのプルリクエストでは主目的から外れるからそのままにしておいて、これらの課題点と解決策の案をissueにまとめるというのはどうでしょう。

Comment on lines 943 to 944
${Locate} "$APPDATA\$%VITE_APP_NAME%\logs" "/L=F /M=????????_??????_error.log /G=0" un.removeLogFile
RMDir "$APPDATA\$%VITE_APP_NAME%\logs"
Copy link
Member

@Hiroshiba Hiroshiba Aug 30, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

この辺りもそうなのですが、実装側の仕様が変わってディレクトリの場所やファイル名が変わったりしてしまうと、この辺りが意図した通りに動かなくなってしまう可能性があるように感じています。
できればここが正しく動かないときに気づけるようにするのが良いだろうなとは感じているのですが、どれぐらい重きを置けばいいかで結構迷っています・・・。

@sabonerune さん的にどう考えられていますか 👀

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • アンインストーラーなので実行時エラーは避けたい
  • ただし未知のファイルの削除は可能な限り避ける

ということを考えて作成しました。

正しく動かないときに気づく方法は思いつかないですね…

ある程度予防する方法なら

  • %APPDATA%/voicevoxディレクトリが残っている場合はダイアログで手動削除を案内する
    • 逆に削除してはいけないものを消してしまった場合は気づくことができない
    • sessionDataを残す場合はこの方法は使えない
  • ドキュメントでuserDataに保存するファイルを明示する
    • 気づかなければ意味がない
  • ディレクトリ名やファイル名のパターンを別の場所で定義してエディタ上で検証、NSISの削除指定もそれを使う
    • そもそも実現できるか不明
    • できたとしても難しかったりNSISスクリプトが肥大化してメンテナンスできなくなる気がする。

等を考えましたがどれも微妙ですね…

Copy link
Member

@Hiroshiba Hiroshiba Aug 30, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

実行時エラーは避けたい
ただし未知のファイルの削除は可能な限り避ける

なるほどです!確かにおっしゃる通りだと思います。予防策としてはなんだかんだ

ドキュメントでuserDataに保存するファイルを明示する

こちらが手軽で、必要な人は情報が(頑張れば)得られるという意味で一番いいのかなと思いました。

@sabonerune
Copy link
Contributor Author

electronでlocalStorageCookieを明示的に使えなくできれば、ディレクトリを移動してしまうのもありな気がしました!
確かブラウザ版はlocalStorageを使用しているので、browserディレクトリ以外でこの辺りの関数やらを使うとESLintでエラーが出るようにすれば行けそう・・・?

軽く調べたのですが多分electronでlocalStorage等を禁止する必要性まではないと思います。
移動しても問題なく保存できていると思います。

  • 現在のsessionDataを残したままだと結局始末できない
  • 移動や削除は漏れが発生した時が怖い

という感じですね。

@Hiroshiba
Copy link
Member

electronでlocalStorageCookieを明示的に使えなくできれば、ディレクトリを移動してしまうのもありな気がしました!
確かブラウザ版はlocalStorageを使用しているので、browserディレクトリ以外でこの辺りの関数やらを使うとESLintでエラーが出るようにすれば行けそう・・・?

軽く調べたのですが多分electronでlocalStorage等を禁止する必要性まではないと思います。
移動しても問題なく保存できていると思います。

あすみません!
話としては、仮にlocalStorageをアンインストール時に消去するようにした場合、将来的にlocalStorageに重要な情報を保存するコードが書かれると、Windowsでのみアンインストール時にその情報が消えるという挙動になり、一部の環境でのみ挙動が異なる謎のバグになりそうだなと思った次第です。
これを防止するにはelectron環境でlocalStorageを使用しようとするとエラーが発生するようにするのが良いのかなと。

現在のsessionDataを残したままだと結局始末できない
移動や削除は漏れが発生した時が怖い

これって変更前のデータを消すのは難しいという話ですよね。
まあこれはどうしようもないかなと思いました。まあ致命的な問題でもないですし、放置でも・・・。

Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

アンインストーラーを作成するにあたってですが、UX的に想定外の挙動をすることがない中で、UXを最大化するのが良さそうに感じました。
100MBを超える情報はなるべく消してあげたいけどUXが下がったりメンテナンス性が落ちる選択肢は取りたくない、500MBを超える情報は消しやすいように案内してあげたい、という気持ちです。

この方針でレビューコメントをさせていただこうと思います 🙇

Comment on lines 972 to 973
; "engine_manifest.json"があるか確認してから削除する。
IfFileExists "$R9\engine_manifest.json" 0 +3
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

この辺りのif文は将来正しく動かない可能性がありそうですが、仮に正しく動かなかったとしてもチェックボックスが出ないだけ=ユーザーが想定外の挙動を経験することがないので、正しく動かない可能性はそこまで問題ではなさそうに思いました!

build/installer.nsh Outdated Show resolved Hide resolved
Comment on lines 921 to 924
${If} $removeAllUserDataCheckBoxState == ${BST_CHECKED}
MessageBox MB_YESNO|MB_ICONEXCLAMATION "全ての設定ファイルを削除します。本当によろしいでしょうか。" IDYES +2
Abort
${EndIf}
Copy link
Member

@Hiroshiba Hiroshiba Aug 30, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

すみません、ちょっと意図の伝え方がまずかったのですが、設定を全部吹き飛ばすのを聞くダイアログはなくていい想定でいました。
こんな感じのロジックでどうでしょう・・・?

  • setting.jsonを消すかどうかのチェックボックス
    • 名称は「設定ファイルを消す」など
    • デフォルトでオフ
  • 追加エンジンを消すかどうかのチェックボックス
    • 追加エンジンがあればチェックボックス自体を表示する
    • デフォルトでオン
  • それ以外のファイルは現状で消しても良いやつは問答無用で消す
    • 消してはいけないのは将来的に設定が保存されそうなファイル
      • localStorageやCookieなど
    • それ以外は消しちゃってもOK

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

一度userDataに配置されるファイルとディレクトリを整理します。

%APPDATA%
├── voicevox
│   ├── config.json  (electron-store)
│   ├── window-state.json  (electron-window-state)
│   ├── logs
│   │   └── ????????_??????_error.log
│   │
│   └── vvpp-engines
│       ├── .tmp
│       │   └── ??????????????
│       │       └── 展開中のエンジンのファイル(恐らくエラー等で中断して残ってしまったもの)
│       │
│       └── *+????????-????-????-????-????????????
│           └── エンジンのファイル
│
└── voicevox-[cpu|cuda]
    └── logs  (electron-log)

現在の確認ダイアログでOKを選択した後のコードは

  • 追加エンジンのみ削除するを選択した場合vvpp-engines下のファイルとディレクトリをを削除
  • 全ての設定ファイルを削除するを選択した場合voicevoxvoicevox-[cpu|cuda]下のファイルとディレクトリを削除
  • どちらの場合でも上記の表にないファイル(sessonDataや未知のファイル)は削除しないまま残す

としています。


  • それ以外のファイルは現状で消しても良いやつは問答無用で消す
    • 消してはいけないのは将来的に設定が保存されそうなファイル

これが難しいと思います。

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

整理ありがとうございます!!
なるほどです、window-state.jsonとかもありましたね・・・。
他にもsessionDataなどがある感じでしたっけ。

  • それ以外のファイルは現状で消しても良いやつは問答無用で消す
    • 消してはいけないのは将来的に設定が保存されそうなファイル

これが難しいと思います。

ここちょっと難度感をわかってなくて知りたいのですが、どこに設定が保存されているかわからないから難しい、ということでしょうか・・・? 👀

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここちょっと難度感をわかってなくて知りたいのですが、どこに設定が保存されているかわからないから難しい、ということでしょうか・・・? 👀

そうですね。
sessionDataのファイルがドキュメント化されていないので削除するとしたら%APPDATA%\voicevoxを丸ごと削除するしかないが、そうすると将来的に設定が保存されそうなファイルも一緒に消してしまうという感じです。

Copy link
Member

@Hiroshiba Hiroshiba Sep 5, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

なるほどです。
sessionDataの保存先を変更すれば、変更後のデータはアンインストールできるかも?

ただこの場合でも今までのデータは消去できませんが、どうしようもない気がします。
ベータ版の段階で気づけたのでまだ良かったかなと(言い訳ですが・・・)。
他のOSのこともあるし、Q&Aで案内とかしてもいいかもですね。。

@sabonerune
Copy link
Contributor Author

話としては、仮にlocalStorageをアンインストール時に消去するようにした場合、将来的にlocalStorageに重要な情報を保存するコードが書かれると、Windowsでのみアンインストール時にその情報が消えるという挙動になり、一部の環境でのみ挙動が異なる謎のバグになりそうだなと思った次第です。
これを防止するにはelectron環境でlocalStorageを使用しようとするとエラーが発生するようにするのが良いのかなと。

この場合、設定ファイルも削除するのは危険な気がします。
設定だけを削除した場合localStorageelectron-storeの設定であり得ない組み合わせができるというリスクがあると思います。

一度、設定ファイルの削除は諦めてエンジンの削除だけ実装にしてもいい気がしてきました。

@Hiroshiba
Copy link
Member

この場合、設定ファイルも削除するのは危険な気がします。
設定だけを削除した場合localStorageelectron-storeの設定であり得ない組み合わせができるというリスクがあると思います。

あれ、これってなぜでしたっけ 🙇
localStorageに設定が保存される場合、electron-storeと整合性が取れない設定が保存される可能性があるから、片方だけ消去するのは危険ということ・・・?
もしそうだったら、僕の提案はlocalStorageを使えないようにESLintを設定しようという案なので、まさしくそれを解決しようと思っていた感じです・・・!

一度、設定ファイルの削除は諦めてエンジンの削除だけ実装にしてもいい気がしてきました。

こちらの方針もありだと思います!

@sabonerune
Copy link
Contributor Author

ではエンジンの削除のみに変更しようと思います。

@Hiroshiba
Copy link
Member

Hiroshiba commented Sep 5, 2023

@sabonerune 承知です!!良いと思います!

削除するエンジンが存在するかの判定を厳密化
$R0はFunctonとのやり取りに使うパターンが多かったので$0に変更
その他コードの整理
@sabonerune sabonerune changed the title feat: Windowsのアンインストーラーで設定とインストールしたエンジンを削除できるようにする feat: Windowsのアンインストーラーでインストールしたエンジンを削除できるようにする Sep 5, 2023
build/installer.nsh Outdated Show resolved Hide resolved
Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1つコメントしましたがほぼlgtmです!!!
勉強になりました、ありがとうございました!

思ったのですが、UX的に考えるとエンジンをインストールし終わったタイミングで、アプリのアンインストールではエンジンが消えないから手動でアンインストールしてもらうことを案内する手もあったのかなと思いました。
この方法ならアンインストーラーの複雑性をあげなくてすみ、OSごとの差分も吸収でき、Q&Aを偶然見に行かなくてもわかるのかなと。
まあもちろん人はエンジンのパージを忘れてアプリをアンインストールしがちだとは思いますが、こういう解決策もあったかなとか思いました。
(後でissueを建てようかなと思います)

@sabonerune
Copy link
Contributor Author

VvppManagerのユニットテストを実装しようとしましたが追加エンジンのディレクトリ名のテスト以外は動作させることができませんでした。

Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!!!

マルチエンジン周り・メンテナンス周りということで共有メンションです 🙏
@y-chan @sevenc-nanashi
(もしよかったらレビューコメントいただけるとすごく心強いです 🙇 )

Copy link
Member

@y-chan y-chan left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

遅くなりました、LGTMです!!
nanashiさんのレビューがないですが、メンテナ2人のapproveになるのでマージしてしまいますね...!

@y-chan y-chan merged commit 2346306 into VOICEVOX:main Sep 17, 2023
@sabonerune sabonerune deleted the feat/win-uninstall-userdata branch September 18, 2023 00:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants