分叉核心 eslint 规则
Posted
技术标签:
【中文标题】分叉核心 eslint 规则【英文标题】:Forking core eslint rules 【发布时间】:2021-12-26 02:37:55 【问题描述】:我想对核心 eslint 规则做一些小的修改,例如array-bracket-newline
,或indent
。这些规则通常取决于eslint
中的实用程序,最常见的是ast-utils
。到目前为止,我已经使用了一个插件,在那里添加了修改后的规则,并做了一个require('eslint/lib/rules/utils/ast-utils')
,因为eslint
无论如何都是对等依赖项。
由于https://github.com/eslint/eslint/commit/24c9f2ac57efcd699ca69695c82e51ce5742df7b 这不再可能,因为exports
指令已添加到package.json
。现在改变核心 eslint 规则行为的常用方法是什么?
eslint
整体上看起来不干净,因为还有很多其他部分依赖于它(从 eslint-plugins 开始,到 vscode 扩展、yarn sdks ......)。每个都需要更改,或者使用一些非常肮脏的重命名,其中分叉假装是原始的(等待发生的事故)。
修补 exports
的纱线包看起来真的很脏。
有什么干净的方法吗?
编辑:我目前最好的想法是分叉eslint
,删除exports
,然后在分叉上使用require('eslint-fork/lib/rules/utils/ast-utils')
。这意味着我无缘无故需要一个额外的eslint
副本,但它是用于 linting,一点磁盘空间并不重要。
【问题讨论】:
你考虑过github.com/not-an-aardvark/eslint-rule-composer 吗? 感谢您的提示,但它似乎不够强大,因为我无法更改现有规则的行为,只需添加或删除它,而不使用规则自己的分析. 【参考方案1】:可以通过完整路径要求未导出的文件,即:
const dirname, join = require('path');
const astUtilsPath = join(dirname(require.resolve('eslint')), 'rules/utils/ast-utils.js');
const astUtils = require(astUtilsPath);
请注意,此方法依赖于位于特定包文件夹中的主导出(在 eslint 的情况下为“lib”)。
【讨论】:
谢谢,这行得通。您是否知道,yarn
对于这种绝对导入的行为?通常,检查文件的导入(例如require
)以列在相关项目的依赖项中。在这种情况下,它会冒泡文件夹,直到找到package.json
,还是跳过任何检查或其他?
你是对的,当评估一个模块时,最近的父文件夹中的 package.json 用于查找依赖项和其他设置。这就是 Node.js 的工作原理(如果您有兴趣,here 是相关代码)。 npm 和 yarn 都使用 Node.js 来评估模块。以上是关于分叉核心 eslint 规则的主要内容,如果未能解决你的问题,请参考以下文章
如何将 typescript-eslint 规则添加到 eslint
ESLint - 覆盖来自 eslint-plugin-prettier 的规则