为什么implementation_imports linting规则仅在lib目录中起作用?

问题描述 投票:0回答:1

我对 dart 还很陌生,据我了解,你永远不应该从其他包的

lib/src
目录导入,因为它(按照惯例)是相应包的实现代码。这应该通过
implementation_imports
linting 规则进行检查。

所以我将规则添加到我的

analysis_options.yaml
文件中:

linter:
  rules:
    - implementation_imports

这对于

lib/
目录中的文件效果很好,我可以在 VS Code 问题部分以及运行
dart analyze
时看到该消息。然而,似乎其他顶级目录中的文件(例如
bin/
test/
)被忽略。

我尝试搜索此问题,但没有找到任何有用或相关的内容。 这是设计使然吗?我的配置/版本有问题吗? 因为我不明白为什么这个规则不应该适用于 lib 以外的目录?

Dart SDK version: 3.2.6

dev_dependencies:
  lints: ^3.0.0
dart lint
1个回答
0
投票

在此 linter 规则的源代码中,有以下几行:

@override
void visitImportDirective(ImportDirective node) {
  var importUri = node.element?.importedLibrary?.source.uri;
  var sourceUri = node.element?.source.uri;

  // Test for 'package:*/src/'.
  if (!isImplementation(importUri)) {
    return;
  }

  // If the source URI is not a `package` URI bail out.
  if (!isPackage(sourceUri)) {
    return;
  }

  if (!samePackage(importUri, sourceUri)) {
    rule.reportLint(node.uri);
  }
}

注意它如何检查

sourceUri
是否是一个包,如果不是则“退出”。这是
isPackage
函数的实现:

bool isPackage(Uri? uri) => uri?.scheme == 'package';

当源文件不在

/lib
目录中时,它的 URI 中不会有
package
方案。它使这个
visitImportDirective
函数在该检查中返回,并且不会调用该
reportLint
方法。

© www.soinside.com 2019 - 2024. All rights reserved.