プレコミットフック
Prettierは、pre-commitツールと併用できます。これは、コミット前にgit add
で「ステージング」されたファイルのフォーマットを再フォーマットできます。
lint-staged
オプション 1.ユースケース: Prettierと一緒に他のコード品質ツール(ESLint、Stylelintなど)を使用する場合、または部分的にステージングされたファイル(git add --patch
)のサポートが必要な場合に便利です。
続行する前に、Prettierがインストールされ、devDependencies
にあることを確認してください。
npx mrm@2 lint-staged
これは、huskyとlint-stagedをインストールし、プレコミットフックでサポートされているファイルを自動的にフォーマットする設定をプロジェクトのpackage.json
に追加します。
詳しくは、lint-stagedリポジトリをご覧ください。
Husky.Net
オプション 2.ユースケース: Prettierを他のコード品質ツール(例:dotnet-format、ESLint、Stylelintなど)と一緒に使用するためのdotnetソリューション。複数のファイル状態(staged - last-commit、git-filesなど)をサポートしています。
dotnet new tool-manifest
dotnet tool install husky
dotnet husky install
dotnet husky add pre-commit
インストール後、prettierタスクをtask-runner.json
に追加できます。
{
"command": "npx",
"args": ["prettier", "--ignore-unknown", "--write", "${staged}"],
"pathMode": "absolute"
}
git-format-staged
オプション 3.ユースケース: 部分的にステージングされたファイルをフォーマットしたい場合、他のオプションがプロジェクトに適していない場合に最適です。
Git-format-stagedは、stdinを介してファイルコンテンツを受け入れることができる任意のフォーマッタを実行するために使用されます。部分的にステージングされたファイルをフォーマットする他のツールとは動作が異なります。gitオブジェクトデータベース内のオブジェクトに直接フォーマッタを適用し、変更をワーキングツリーにマージします。この手順により、いくつかの保証が提供されます
- コミットの変更は常にフォーマットされます。
- ステージングされていない変更は、フォーマットプロセス中にいかなる状況下でもステージングされません。
- フォーマットされた、ステージングされた変更とステージングされていない変更の間に競合がある場合、ワーキングツリーファイルは変更されません - 作業が上書きされることはなく、クリーンアップするstashはありません。
- ステージングされていない変更はフォーマットされません。
Git-format-stagedには、Python v3またはv2.7が必要です。Pythonは通常、LinuxとmacOSにはプリインストールされていますが、Windowsにはプリインストールされていません。huskyでgit-format-stagedを使用してください
npx husky init
npm install --save-dev git-format-staged
node --eval "fs.writeFileSync('.husky/pre-commit', 'git-format-staged -f \'prettier --ignore-unknown --stdin --stdin-filepath \"{}\"\' .\n')"
yarn husky init
yarn add --dev git-format-staged
node --eval "fs.writeFileSync('.husky/pre-commit', 'git-format-staged -f \'prettier --ignore-unknown --stdin --stdin-filepath \"{}\"\' .\n')"
pnpm exec husky init
pnpm add --save-dev git-format-staged
node --eval "fs.writeFileSync('.husky/pre-commit', 'git-format-staged -f \'prettier --ignore-unknown --stdin --stdin-filepath \"{}\"\' .\n')"
bunx husky init
bun add --dev git-format-staged
bun --eval "fs.writeFileSync('.husky/pre-commit', 'git-format-staged -f \'prettier --ignore-unknown --stdin --stdin-filepath \"{}\"\' .\n')"
プロジェクトに合わせてファイル拡張子を追加または削除します。リストする拡張子に関係なく、フォーマットはプロジェクト内の.prettierignore
ファイルを尊重することに注意してください。
git-format-stagedの仕組みについては、部分的にステージングされたファイルの自動コードフォーマットをご覧ください。
オプション4. シェルスクリプト
あるいは、このスクリプトを.git/hooks/pre-commit
として保存し、実行権限を与えることもできます
#!/bin/sh
FILES=$(git diff --cached --name-only --diff-filter=ACMR | sed 's| |\\ |g')
[ -z "$FILES" ] && exit 0
# Prettify all selected files
echo "$FILES" | xargs ./node_modules/.bin/prettier --ignore-unknown --write
# Add back the modified/prettified files to staging
echo "$FILES" | xargs git add
exit 0
コミット後に、Prettierでフォーマットされたファイルがまだ変更されているとgitから報告された場合は、gitのインデックスを更新するためのポストコミットスクリプトを追加する必要があるかもしれません。
.git/hooks/post-commit
に次のようなものを追加します
#!/bin/sh
git update-index -g