分叉核心 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 的代码块)。 forking 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 的规则

ESLInt 插件和 ESLInt 规则有啥区别?要创建自定义规则,我们必须先创建自己的插件吗?

ESLint常见命令(规则表)

eslint检测规则中,括弧和函数名之间去掉空格的配置

如何在 React Native 默认 eslint 配置中删除 eslint 单引号规则?