提交前钩子
您可以将 Prettier 与提交前工具一起使用。这可以在您提交之前,通过 `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.使用场景:一个 .NET 解决方案,用于将 Prettier 与其他代码质量工具(例如 dotnet-format、ESLint、Stylelint 等)一起使用。它支持多种文件状态(暂存 - 上次提交、git 文件等)。
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 对象数据库中的对象,并将更改合并回工作树。此过程提供了一些保证
- 提交中的更改始终会被格式化。
- 在任何情况下,未暂存的更改都不会在格式化过程中被暂存。
- 如果格式化后的暂存更改与未暂存的更改之间存在冲突,则您的工作树文件将保持不变 - 您的工作不会被覆盖,并且没有需要清理的暂存区。
- 未暂存的更改不会被格式化。
Git-format-staged 需要 Python v3 或 v2.7。Python 通常预装在 Linux 和 macOS 上,但在 Windows 上没有。使用 git-format-staged 和 husky
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. Shell 脚本
或者,您可以将此脚本保存为 `.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
如果 git 在提交后报告您美化的文件仍被修改,您可能需要添加一个 提交后脚本以更新 git 的索引。
在 `.git/hooks/post-commit` 中添加如下内容
#!/bin/sh
git update-index -g