使用 Angular 7 和 `ng lint` 在 TypeScript 中自定义 TSLint 规则

Custom TSLint Rule in TypeScript with Angular 7 and `ng lint`

我为正在维护的库创建了一个新工作区。我们有 2 个我们在 Angular 5 中使用的自定义 TSLint 规则,它们没有利用 Angular CLI。我们现在正在转向 Angular CLI 和 Angular 7.

我们所做的一件事是不需要在 TSLint 拾取它们之前将这些 TSLint 规则编译为 JS。但是,这需要在我们的 package.json 的 lint 脚本中使用 ts-node

如何告诉 ng 获取这些 TypeScript TSLint 规则文件?

tsconfig.json(在projects/my-lib/src

{
  "rulesDirectory": "./lib/tslint-rules"
}

然后,在我们的主工作区中,我们从库中扩展这个 tsconfig 并添加我们的自定义规则。

Could not find implementations for the following rules specified in the configuration:
    my-custom-tslint-rule
Try upgrading TSLint and/or ensuring that you have all necessary custom rules installed.
If TSLint was recently upgraded, you may have old rules configured which need to be cleaned up.

好的,所以我明白了。如果您想在 Angular 库中包含自定义 TSLint 规则,则需要做一些事情。

  1. 确保它们在您的 public_api.ts 中导出。这将确保当您 运行 ng build <library-name> TypeScript 编译器将拾取这些文件并编译它们并将它们放入 dist 文件夹中。

  2. 配置您的 tsconfig.lib.json 以使用 non-es6/es2015 模块。这就是给我带来很多问题的原因。似乎 TSLint 不支持 es2015 样式模块。我已将其切换为使用 umd。 (我还注意到 commonjs 也工作得很好。)

{
  "compilerOptions": {
    ...
    "module": "umd",
  }
}
  1. 在安装了这个库的任何项目中,您可以通过执行以下操作来选择您的规则。编辑您的 tslint.json 并将安装的 node_modules tslint-rules 添加到您的 tslint.json。然后,将您的特定规则添加到规则列表中。
  "rulesDirectory": [
    // ...,
    "node_modules/<my-package>/esm2015/lib/tslint-rules"
  ],

然后,添加您配置的规则如下:

  "rules": {
    // ...,
    "my-custom-rule": true,
    // ...
  }
  1. 或者,您也可以在您的库中设置一个 tslint-default.json,并在 运行 宁 ng build 之后将其复制到您的 dist 文件夹中。这应该添加了规则目录和自定义规则的默认设置。

然后,当你在其他地方安装这个包时,你只需要从安装的 node_modules 文件夹扩展这个 tslint-default.json

希望这对尝试构建 Angular 库并包含自定义 TSLint 规则的任何人有所帮助。