我对 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
在此 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
方法。