diff --git a/website/docs/en/guide/_meta.json b/website/docs/en/guide/_meta.json index c8316513..e59fcba1 100644 --- a/website/docs/en/guide/_meta.json +++ b/website/docs/en/guide/_meta.json @@ -42,6 +42,11 @@ "name": "formatting", "label": "Formatting" }, + { + "type": "file", + "name": "git-hooks", + "label": "Git hooks" + }, { "type": "file", "name": "monorepo", diff --git a/website/docs/en/guide/cli/staged.mdx b/website/docs/en/guide/cli/staged.mdx index 0ff122f8..582bb554 100644 --- a/website/docs/en/guide/cli/staged.mdx +++ b/website/docs/en/guide/cli/staged.mdx @@ -96,7 +96,7 @@ Configure staged-file tasks through [`define.staged()`](../configuration#define- import { define } from 'rstack'; define.staged({ - '*.{js,jsx,ts,tsx}': ['rs lint', 'rs fmt'], - '*.{json,md,mdx,css,html}': 'rs fmt', + '*.{js,jsx,ts,tsx,mjs,cjs,mts,cts}': ['rs lint --fix', 'rs fmt'], + '*.{json,md,mdx,css,scss,less,html,yml,yaml}': 'rs fmt', }); ``` diff --git a/website/docs/en/guide/git-hooks.mdx b/website/docs/en/guide/git-hooks.mdx new file mode 100644 index 00000000..b57fa088 --- /dev/null +++ b/website/docs/en/guide/git-hooks.mdx @@ -0,0 +1,81 @@ +--- +description: 'Set up repository Git hooks with Rstack CLI and automatically lint and format staged files before each commit.' +--- + +# Git hooks + +import { PackageManagerTabs } from '@rspress/core/theme'; + +Use [`rs setup`](./cli/setup) to manage repository-level Git hooks that run project commands. By default, hook scripts live in `.rstack/hooks`. You can use them to validate commit messages, check code before pushing, or format files before committing. + +This page uses `pre-commit` as an example: first install Git hooks with `rs setup`, then run [`rs staged`](./cli/staged) from the `pre-commit` hook to lint and format the files staged for the commit. + +## Set up hooks + +Add `rs setup` to the `prepare` script of the project that owns the repository hooks: + +```json title="package.json" +{ + "scripts": { + "prepare": "rs setup" + } +} +``` + +Run the script once to install the hooks: + + + +`rs setup` sets the repository's `core.hooksPath` to `.rstack/hooks/_`. Verify the installation with: + +```bash +git config --local --get core.hooksPath +# .rstack/hooks/_ +``` + +:::tip + +- The `_` directory is generated dynamically and ignored by Git by default. +- If `rs setup` detects another hooks path or existing Git hooks, it skips installation. Migrate any hooks you want to keep, remove the existing configuration, and then try again. See the [`rs setup` guide](./cli/setup#hook-files) for details. + +::: + +## Pre-commit checks + +A `pre-commit` hook can lint and format the files staged for the current commit. + +### Configure tasks + +Add staged-file tasks to the Rstack config file. Adjust the glob patterns for the languages used by your project: + +```ts title="rstack.config.ts" +import { define } from 'rstack'; + +define.staged({ + '*.{js,jsx,ts,tsx,mjs,cjs,mts,cts}': ['rs lint --fix', 'rs fmt'], + '*.{json,md,mdx,css,scss,less,html,yml,yaml}': 'rs fmt', +}); +``` + +### Add the hook + +Create `.rstack/hooks/pre-commit` and run `rs staged` from it: + +```sh title=".rstack/hooks/pre-commit" +rs staged +``` + +### How it works + +When you run `git commit`, Git invokes the hook installed by `rs setup`. The hook executes `.rstack/hooks/pre-commit`, and `rs staged` then runs the configured tasks on the staged files. + +`rs staged` passes matching staged files to each command. Commands in an array run in order: [`rs lint --fix`](./cli/lint) first applies available fixes, then [`rs fmt`](./cli/fmt) formats the result. Remove `--fix` if lint errors should block the commit without changing files. + +After every task passes, the commit continues and includes the fixed and formatted results. If any task fails, the commit stops; fix the issue and then try again. diff --git a/website/docs/zh/guide/_meta.json b/website/docs/zh/guide/_meta.json index 1c7c16cb..a1a41dc9 100644 --- a/website/docs/zh/guide/_meta.json +++ b/website/docs/zh/guide/_meta.json @@ -42,6 +42,11 @@ "name": "formatting", "label": "格式化" }, + { + "type": "file", + "name": "git-hooks", + "label": "Git hooks" + }, { "type": "file", "name": "monorepo", diff --git a/website/docs/zh/guide/cli/staged.mdx b/website/docs/zh/guide/cli/staged.mdx index 6191a678..8b716498 100644 --- a/website/docs/zh/guide/cli/staged.mdx +++ b/website/docs/zh/guide/cli/staged.mdx @@ -96,7 +96,7 @@ rs staged --help import { define } from 'rstack'; define.staged({ - '*.{js,jsx,ts,tsx}': ['rs lint', 'rs fmt'], - '*.{json,md,mdx,css,html}': 'rs fmt', + '*.{js,jsx,ts,tsx,mjs,cjs,mts,cts}': ['rs lint --fix', 'rs fmt'], + '*.{json,md,mdx,css,scss,less,html,yml,yaml}': 'rs fmt', }); ``` diff --git a/website/docs/zh/guide/git-hooks.mdx b/website/docs/zh/guide/git-hooks.mdx new file mode 100644 index 00000000..ade6da5d --- /dev/null +++ b/website/docs/zh/guide/git-hooks.mdx @@ -0,0 +1,81 @@ +--- +description: '使用 Rstack CLI 配置仓库级 Git hooks,并在提交前自动检查和格式化暂存文件。' +--- + +# Git hooks \{#git-hooks} + +import { PackageManagerTabs } from '@rspress/core/theme'; + +使用 [`rs setup`](./cli/setup) 可以统一管理仓库级 Git hooks,并通过 hook 脚本运行项目命令。hook 脚本默认存放在 `.rstack/hooks` 中,可用于校验提交信息、推送前检查代码、提交前格式化文件等场景。 + +下面以 `pre-commit` 为例:先通过 `rs setup` 安装 Git hooks,再在 `pre-commit` hook 中运行 [`rs staged`](./cli/staged),对本次提交的暂存文件进行代码检查和格式化。 + +## 安装 hooks \{#set-up-hooks} + +在负责管理仓库 hooks 的项目中,将 `rs setup` 添加到 `package.json` 的 `prepare` 脚本: + +```json title="package.json" +{ + "scripts": { + "prepare": "rs setup" + } +} +``` + +执行一次该脚本,完成 hooks 安装: + + + +`rs setup` 会将仓库的 `core.hooksPath` 设为 `.rstack/hooks/_`,可以通过以下命令确认是否安装成功: + +```bash +git config --local --get core.hooksPath +# .rstack/hooks/_ +``` + +:::tip + +- `_` 目录由命令动态生成,且默认被 Git 忽略。 +- 如果检测到其他 hooks 路径或已有 Git hooks,`rs setup` 会跳过安装。请先迁移需要保留的 hooks,移除原有配置,然后重试。详细说明请参考 [`rs setup` 指南](./cli/setup#hook-files)。 + +::: + +## 提交前检查 \{#pre-commit-checks} + +通过 `pre-commit` hook 可以检查和格式化本次提交的暂存文件。 + +### 配置任务 \{#configure-tasks} + +在 Rstack 配置文件中添加暂存文件任务,根据项目实际使用的语言来调整 glob 模式: + +```ts title="rstack.config.ts" +import { define } from 'rstack'; + +define.staged({ + '*.{js,jsx,ts,tsx,mjs,cjs,mts,cts}': ['rs lint --fix', 'rs fmt'], + '*.{json,md,mdx,css,scss,less,html,yml,yaml}': 'rs fmt', +}); +``` + +### 添加 hook \{#add-the-hook} + +创建 `.rstack/hooks/pre-commit`,并在其中运行 `rs staged`: + +```sh title=".rstack/hooks/pre-commit" +rs staged +``` + +### 执行流程 \{#how-it-works} + +运行 `git commit` 时,Git 会调用 `rs setup` 安装的 hook。该 hook 会执行 `.rstack/hooks/pre-commit`,再由 `rs staged` 对暂存文件运行配置的任务。 + +`rs staged` 会将匹配的暂存文件传给对应命令,数组中的命令按顺序执行,[`rs lint --fix`](./cli/lint) 先修复可自动处理的问题,再由 [`rs fmt`](./cli/fmt) 统一格式。如果只希望代码检查阻止提交而不修改文件,可以移除 `--fix`。 + +全部任务通过后,提交会继续,并包含修复和格式化结果。任一任务失败都会中止提交,解决问题后重新提交即可。