在暂存文件上运行 eslint "ONLY"
Posted
技术标签:
【中文标题】在暂存文件上运行 eslint "ONLY"【英文标题】:Run eslint "ONLY" on the staged files 【发布时间】:2020-10-07 01:30:13 【问题描述】:我正在尝试使用预提交挂钩在提交发生之前检测 eslint 错误。我正在使用 husky 和 lint-staged。但它对 src 中的所有文件运行 lint 命令,而不是仅对暂存文件运行。这是我的 package.json 文件。
"scripts":
"test:ci": "cross-env CI=true react-scripts test --bail --passWithNoTests",
"lint": "eslint src/**/*.js,jsx",
"lint:fix": "eslint . --fix",
"precommit": "npm run lint && npm run test:ci"
"husky":
"hooks":
"pre-commit": "lint-staged"
,
"lint-staged":
"*.js": [
"npm run precommit"
],
"*.jsx": [
"npm run precommit"
]
有什么办法让它只适用于暂存文件而不适用于目录中存在的其他文件?
【问题讨论】:
【参考方案1】:"husky":
"hooks":
"pre-commit": "lint-staged"
,
,
"lint-staged":
"*.js": [
"eslint src/**/*.js",
"cross-env CI=true react-scripts test --bail --passWithNoTests",
"git add"
]
,
【讨论】:
如果可行,则需要对 如何eslint src/**/*.js
仅对 staged 文件进行 lint 进行一些解释。我看不出它有任何工作方式。【参考方案2】:
根据lint-staged example,我实现了为了只检查暂存文件(大约需要 5 秒),除非有超过 5 个暂存文件,它会检查所有 repo(可能需要超过 1 分钟):
-
升级
lint-staged
包到最新版本
在您的存储库的根目录中添加一个.lintstagedrc.js
文件。它可能包含如下内容:
module.exports =
'**/*.js?(x)': (filenames) =>
filenames.length > 5 ? 'eslint --ext .js,.jsx . --ignore-path .gitignore --fix .' : `eslint $filenames.join(' ') --fix`,
"*.json": [
"prettier --write"
]
-
从
package.json
文件中删除旧的“lint-staged”命令
【讨论】:
【参考方案3】:使用 husky v7/lint-staged v11.2.0 - 暂存文件将简单地添加到命令的末尾,以空格分隔。如果你有一个调用npx lint-staged
的.husky/pre-commit
文件,然后你有一个这样的lint-staged 配置:
'*.js': [
'eslint'
]
而你修改了 src/foo.js 和 src/bar.js,将会运行的命令是:
eslint src/foo.js src/bar.js
不管您在 lint-staged 配置中使用什么命令。文件只是添加到命令末尾,用空格分隔。
【讨论】:
我的另一个问题是,如何获取在两次 git 提交之间修改的所有 .js/ts/tsx/jsx 文件的列表,但这将在不同的线程中。跨度>以上是关于在暂存文件上运行 eslint "ONLY"的主要内容,如果未能解决你的问题,请参考以下文章
在暂存文件#snowflake-cloud-platform 上选择中的列绑定变量