Closed6

VS Code Prettier拡張でPretteir v2/v3両対応を試みる

teppeisteppeis

https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode

この拡張には現在 (2023/07/30 9.19.0 時点) はまだPrettier v2が同梱されている。同梱をv3に変更するPRはまだマージされていない(と書いてたらさっきマージされた)。

https://github.com/prettier/prettier-vscode/pull/3069

ただ、この拡張は対象ワークスペースのプロジェクトのローカルにprettierがインストールされていればそっちを使ってくれるので、この拡張の変更のリリースを待たずとも、単にプロジェクトでprettierをアップデートすればVS Codeでもv3が使われて期待通り動くはず。

が、結果は予想に反して、v3で動いているはずなのにtrailingCommaallではなく、v2相当のes5で動いてしまってた。あれ?

teppeisteppeis

原因は、この拡張は拡張側でPrettierのデフォルト設定を独自に持ってしまっていて、プロジェクトに設定ファイルprettierrcが無い場合は拡張側のデフォルト設定が使われるから。Prettierインスタンスのデフォルト設定は無視される。だからプロジェクトローカルのPrettierインスタンスがv3であっても、拡張が抱えているデフォルト設定がv2時代のままなので、trailingComma:es5の挙動になっていた。

https://github.com/prettier/prettier-vscode/blob/v9.19.0/package.json#L256-L263

ということは、上記のPRの変更がリリースされると、今度は逆にプロジェクトローカルがv2の場合でも、VS Codeでの挙動はv3相当でtrailingComma:allなってしまうということになる。

プロジェクトによってPrettier v2とv3がどちらも使われている過渡期なので、ちゃんとプロジェクトローカルのバージョンに従った挙動で動いてほしいという気持ち。

teppeisteppeis

回避策の1つは、プロジェクトローカルに空の設定ファイルを置くこと (by @__sosukesuzuki)。これは拡張の設定より優先されるので、結果的にローカルのprettierインスタンスのデフォルト設定が適用される。が、せっかく無設定でPrettierのデフォルト挙動に合わせてるのに、ファイルを置きたくないし、自分のプロジェクトじゃなかったら勝手におけない。

そこでややハック感がある方法としては、VS Codeの設定をJSONモードにして以下を追加する。

"prettier.trailingComma": null

設定値の型はnon-nullable enumなので設定画面で警告は出るが、無視する。これでtrailingCommaに関してはインスタンスのデフォ値を優先してくれるようになる。

ふーむ、みんなどうしてるんだろう。

teppeisteppeis

設定書いてチームに共有するべきっていうコメントがあったけど、

  • あらゆるツールのデフォルト値を設定ファイルに重複で列挙していくの?っていうのを考えれば筋悪だよね、っていう話
  • 自社/自分の少数のリポジトリならwork aroundとして筋悪でも設定ファイル共有するだろうけど、OSSなどの自分がオーナーシップを持っていないプロジェクトを含む多数のリポジトリを触ることを考えると、それも大変
teppeisteppeis

しばらくVS Codeの設定に

"prettier.trailingComma": null

を書く前述の設定で使ってて期待通りに動いてて問題なさそう。微妙だけどこれで使ってく。

このスクラップは2023/08/23にクローズされました