【学不动系列】lint-staged 使用教程

lint-staged 使用教程

lint-staged 是一个在 git 暂存文件上运行 linters 的工具,当然如果你觉得每次修改一个文件就给所有文件执行一次 lint 检查不恶心的话,这个工具对你来说就没有什么意义了,请直接关闭即可。

npx mrm lint-staged

它将根据package.json依赖项中的代码质量工具来安装和配置 husky 和 lint-staged,因此请确保在此之前安装(npm install --save-dev)并配置所有代码质量工具,如PrettierESlint

不要忘记提交对package.json的更改以与您的团队共享此设置!

现在更改一些文件,git addgit add --patch将其中一些文件修补到您的提交中,并尝试 git 提交它们。

命令行标志

npx lint-staged --help
用法: lint-staged [options]

Options:
-V, --version 输出版本号
–allow-empty 当任务撤消所有分阶段的更改时允许空提交(默认值:false)
-c, --config [path] 配置文件的路径
-d, --debug 打印其他调试信息(默认值:false)
-p, --concurrent 要同时运行的任务数,或者为 false 则要连续运行任务(默认值:true)
-q, --quiet 自己的控制台输出(默认值:false)
-r, --relative 将相对文件路径传递给任务(默认值:false)
-x, --shell 跳过任务解析以更好地支持 shell(默认值:false)
-h, --help 输出用法信息
–allow-empty: 默认情况下,当 LITER 任务撤消所有阶段性的更改时,LITET 阶段将退出一个错误,并中止提交。使用此标志允许创建空 git 提交。
–config [path] : 手动指定配置文件或 npm 包名称的路径。注意:使用时,lint-staged 不会执行配置文件搜索,如果找不到指定的文件,则会打印错误。
–debug :在调试模式下运行。设置后,它将执行以下操作
在内部使用 debug 记录有关暂存文件、正在执行的命令、二进制文件的位置等的其他信息。通过传递标志自动启用的调试日志也可以通过将环境变量$DEBUG 设置为 lint-staged*启用。
使用 verbose 渲染程序的 listr; 这将导致串行无色输出到终端,而不是默认(美化,动态)输出。
–concurrent [number | (true/false)]: 控制由 lint-staged 运行的任务的并发性。注意:这不会影响子任务的并发性(它们将始终按顺序运行)。可能的值为:
false:依次运行所有任务
true(默认):无限并发。并行运行尽可能多的任务
{number}:并行运行指定数量的任务,其中 1 等效于 false。
–quiet:禁止所有 CLI 输出,但任务中除外。
–relative: 将与 process.cwd()(lint-staged 运行)相关的文件路径传递给任务。默认值为 false。
–shell:默认情况下,将分析 linter 命令以提高速度和安全性。这具有常规 shell 脚本可能无法按预期工作的副作用。您可以使用此选项跳过命令解析。

配置

从 v3.1 开始,您现在可以使用不同的方式进行配置:

lint-staged 在你的对象 package.json,.lintstagedrc JSONYML 格式的文件,lint-staged.config.js JS 格式的文件
使用--config-c 标志传递配置文件
配置应该是一个对象,其中每个值都是要运行的命令,其键是要用于此命令的 glob 模式。
这个软件包使用 micromatch 进行全局模式匹配。

package.json 例:

{
   
   
  "lint-staged": {
   
   
    "*": "your-cmd"
  }
}

.lintstagedrc 例:

{
   
   
  "*": "your-cmd"
}

该配置将 your-cmd 使用作为参数传递的当前暂存文件的列表执行。

因此,考虑到您做了 git add file1.ext file2.extlint-staged 将运行以下命令:
your-cmd file1.ext file2.ext

过滤文件

Linter 命令处理由 glob 模式定义的所有暂存文件的子集。lint staged 使用 micromatch 将文件与以下规则匹配:

如果全局模式不包含斜杠(/),matchBase 则将启用 micromatch 的选项,因此无论目录如何,全局匹配文件的基本名称:
“*.js"将匹配所有 JS 文件,例如/test.js 和/foo/bar/test.js
2.”!(*test).js"。将匹配所有以结尾的 JS 文件 test.js,因此 foo.js 但不匹配 foo.test.js
如果全局模式确实包含斜杠(/),则它也将与路径匹配:
"./*.js"将匹配 git repo 根目录中的所有 JS 文件,因此/test.js 但不匹配/foo/bar/test.js
2."foo/**/*.js"将匹配/foo 目录中的所有 JS 文件,所以/foo/bar/test.js 但不匹配/test.js
匹配时,lint-staged 将执行以下操作

自动解决 git root,无需配置。
选择项目目录中存在的暂存文件。
使用指定的 glob 模式过滤它们。
将绝对路径传递给 linters 作为参数。
注意: lint-staged 将绝对路径传递给 linter,以免在其他工作目录(例如,您的.git 目录与您的 package.json 目录不同)中执行时产生混淆。

忽略文件

lint-staged 的概念是在 git 中暂存的文件上运行已配置的 linter(或其他)任务。lint-staged 总是将所有暂存文件的列表传递给任务,忽略任何文件都应该在任务本身中配置。

考虑一个 prettier 用于使代码格式在所有文件中保持一致的项目。 项目还将缩小的第三方供应商库存储在 vendor/目录中。为了防止 prettier 在这些文件上抛出错误,应该将供应商目录添加到 prettier 的忽略配置.prettierignore 文件中。运行 npx prettier .。将忽略整个供应商目录,不会引发错误。当 lint-staged 被添加到项目并配置为运行 prettier 时,prettier 将忽略供应商目录中所有修改的和暂存的文件,即使它将它们作为输入接收。

在高级方案中,如果无法将 linter 任务本身配置为忽略文件,但 lint-staged 仍应忽略某些暂存文件,则可以在使用函数语法将文件路径传递给任务之前对其进行筛选。请参见示例:忽略 match 中的文件。

支持哪些命令?

支持通过本地或全局安装的任何可执行文件 npm,以及$PATH 中的任何可执行文件。

不建议使用全局安装的脚本,因为对于没有安装脚本的人,lint-staged 可能不起作用。

lint-staged 使用 execa 查找本地安装的脚本。因此,您.lintstagedrc 可以编写:

{
   
   
  "*.js": 
### lint-staged 操作失败后 git reset --hard 未执行的原因及解决方案 在使用 `lint-staged` 进行代码提交前的格式化或检查时,如果某些步骤失败,可能会导致 `git reset --hard` 未正确执行。以下是可能的原因及解决方案: #### 原因分析 1. **`lint-staged` 配置问题** 如果 `lint-staged` 的配置文件(如 `.lintstagedrc` 或 `package.json` 中的 `lint-staged` 部分)中定义的任务失败,且未正确处理错误,则可能导致后续的 `git reset --hard` 无法执行[^1]。 2. **任务中断或退出码非零** 当 `lint-staged` 执行的任务(如 ESLint、Prettier 等)返回非零退出码时,可能会中断整个流程,导致 `git reset --hard` 被跳过[^2]。 3. **Git 暂存区状态异常** 如果暂存区的状态在 `lint-staged` 执行过程中被意外修改(例如部分文件被移除或添加),可能会导致 `git reset --hard` 无法正常清理工作区和暂存区[^3]。 4. **环境变量或依赖冲突** 某些情况下,Node.js 版本或依赖库版本不兼容可能导致 `lint-staged` 行为异常,从而影响 `git reset --hard` 的执行[^4]。 --- #### 解决方案 1. **检查 `lint-staged` 配置文件** 确保 `.lintstagedrc` 或 `package.json` 中的 `lint-staged` 配置正确。以下是一个典型的配置示例: ```json { "lint-staged": { "*.{js,ts}": ["eslint --fix", "prettier --write", "git add"] } } ``` 如果任务失败,确保通过 `git add` 将修改后的文件重新加入暂存区[^1]。 2. **捕获错误并强制执行 `git reset --hard`** 在脚本中显式捕获错误,并在任务失败后强制执行 `git reset --hard`。例如: ```bash npx lint-staged || git reset --hard ``` 上述命令表示:如果 `lint-staged` 失败,则执行 `git reset --hard` 清理工作区和暂存区[^2]。 3. **清理 Git 暂存区和工作区** 如果暂存区状态异常,可以手动清理暂存区和工作区。以下是一组常用的清理命令: ```bash # 清理暂存区 git reset HEAD . # 强制恢复工作区 git checkout -- . ``` 上述命令会将暂存区和工作区恢复到最近一次提交的状态[^3]。 4. **更新依赖库版本** 确保使用的 Node.js 和相关依赖库版本与项目要求一致。可以通过以下命令更新依赖: ```bash npm install lint-staged eslint prettier --save-dev ``` 同时,检查项目的 `engines` 字段以确保 Node.js 版本兼容[^4]。 5. **调试 `lint-staged` 流程** 使用 `--debug` 标志运行 `lint-staged`,查看详细的日志输出以定位问题: ```bash npx lint-staged --debug ``` --- ### 示例代码 以下是一个完整的 `package.json` 配置示例,包含错误处理逻辑: ```json { "scripts": { "precommit": "lint-staged || git reset --hard" }, "lint-staged": { "*.{js,ts}": ["eslint --fix", "prettier --write", "git add"], "*.css": ["stylelint --fix", "git add"] } } ``` 上述配置会在 `lint-staged` 失败时自动执行 `git reset --hard`,确保工作区和暂存区的一致性。 --- ### 注意事项 - 如果频繁遇到 `lint-staged` 失败的情况,建议检查任务是否过于复杂或耗时。 - 确保团队成员使用相同的工具链版本,以避免因环境差异导致的问题。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Spider Cat 蜘蛛猫

你的鼓励将会是我最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值