Dartdoc: 未迁移包上的空安全注释

创建于 2020-10-21  ·  10评论  ·  资料来源: dart-lang/dartdoc

繁殖步骤:

# Extract package:retry version 3.0.1
$ curl -L https://storage.googleapis.com/pub-packages/packages/retry-3.0.1.tar.gz | tar -xz
$ pub get

# Get dartdoc from git
$ mkdir /source/dartdoc
$ git clone https://github.com/dart-lang/dartdoc.git /source/dartdoc
$ cd /source/dartdoc; pub get; cd -;

# Generate docs
$ dart /source/dartdoc/bin/dartdoc.dart 

请注意, pubspec.yamlpackage:retry具有:

environment:
  sdk: ">=2.0.0 <3.0.0"

.dart_tool/package_config.jsonpackage:retry指定语言版本 2.0:

{
  "configVersion": 2,
  "packages": [
    /* various other dependencies, mostly test and it's transitive dependencies, omitted here */
    {
      "name": "retry",
      "rootUri": "../",
      "packageUri": "lib/",
      "languageVersion": "2.0" // <-- language version 2.0, hence, no library in package:retry supports null-safety
    }
  ],
  "generated": "2020-10-21T10:44:27.912220Z",
  "generator": "pub",
  "generatorVersion": "2.10.0"
}

意想不到的结果:

3PjXUKmqd6fA2M4

虽然retry函数不能返回null是正确的,但包没有迁移到空安全,所以我们真的应该在这里添加任何类型的空安全标签吗?

P1 bug nnbd

所有10条评论

笔记。 个别库可以选择退出空安全是正确的,因此,可以说注释一个函数或类是否支持空安全是有价值的。

但是对于大多数迁移到 null-safety 的包,所有库都将迁移到 null-safety。

编辑:我不完全确定我们应该在这里做什么。 只是在没有语言版本 >= 2.12.0 的包中向库添加“空安全”可能是错误的。

同意这可能是错误的。 不确定这里发生了什么,但明天会尝试调查; 如果它很普遍(即我们现在出于某种原因将所有东西都标记为这样)可能应该提升到 P1。

我知道分析器仍然知道这些不是空安全包的事实,但是现在我们到处散布空安全标签。

@jcollins-g 我们是否想要在会员级别使用此标签? 在其他地方,例如在 pub.dev 上,我们将把空安全视为包级属性(整个包都有,或者没有)

@mit-mit 无论哪种方式,我都没有强烈的意见。 有一种观点认为,在浏览 API 文档的语料库和跨越包边界时,知道您何时偶然进入(或退出)空安全包可能会很好,并且成员标记是一种方法那。

我们可以把它放在这里吗?

Screenshot 2020-10-22 at 21 05 14

有一种观点认为,在浏览 API 文档的语料库和跨越包边界时,知道您何时偶然进入(或退出)空安全包可能会很好,并且成员标记是一种方法那。

通常是否有可能从空安全包中跌出非空安全包?

pub.dev上, pana pub.dev的分析只会将包分类为支持 null-safety ,如果:

  • 语言版本是>=2.12
  • 包中没有库使用 _language 版本标记_( // @dart=2.5 )选择退出空安全,
  • 当前pub upgrade解析中的所有依赖项(不包括dev_dependencies )_supports null-safety_(遵循此递归定义)。

因此,如果您开始阅读支持空安全的包的文档,您不太可能意外地发现一个不是空安全的包/库。

但是,如果您从一个非空安全的包开始,您可以走另一条路。 如果你最终通过在谷歌搜索中找到文档页面,我想知道它也很高兴。 所以图书馆级别的标签可能很好。

由于https://github.com/dart-lang/sdk/issues/43903 ,这被证明是一个难以解决的问题,据我所知,由于实验标志及其使用方式,这也是一个难以解决的问题对于不可为空。 当标志变为默认值时,此问题可能会“消失”。 我的倾向是允许标签在短时间内出错,假设该标志很快在分析器中成为默认值,因为解决这个问题需要付出很大的努力。 周一将与分析器团队讨论,他们中的大部分人今天都出去了。

一些坏消息。 将标志默认为 on 实际上并不能解决问题。 所以我们需要额外的工作来纠正这个问题。 好消息是@scheglov已经在分析器和 dartdoc 中做了繁重的工作来解决 #2309 中的这个问题,尽管它需要更新并修复了一些 Windows 兼容性问题。 一旦这项工作落地,应该可以修复这个错误。

现在开始基于 #2309 的 PR,修复他遇到的问题并解决合并冲突。

尝试使用 #2309 的更新版本来解决这个问题遇到了麻烦。 简短的版本是 dartdoc 允许一些需要非默认解析器的东西,所以我们的一些测试失败了。 这可能是可以解决的,但不是在时间范围内。

我第二次尝试“修复”它只是在 dartdoc 中重新实现了 pubspec 阅读逻辑。 这很愚蠢,但会奏效。 @scheglov指出,这可能是由于未将包传递到 AnalysisDriver 而造成的,事实上,我们未能做到这一点。

2411 通过将正确的包结构传递给 AnalysisDriver 来纠正该问题,从而进行修复。

提交错误 #2410 以处理 AnalysisContextCollection 的端口,因为未能解决该债务无疑会在未来导致更多类似这样的混乱问题。

提交错误 #2409 以实现@mit-mit 关于更改空安全标签位置的评论。

#2411登陆后将关闭并发布新版本。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

robbecker-wf picture robbecker-wf  ·  12评论

natebosch picture natebosch  ·  12评论

sathishmscict picture sathishmscict  ·  13评论

rubensdemelo picture rubensdemelo  ·  31评论

dnfield picture dnfield  ·  11评论