【问题标题】:In the absence of a `pubspec.yaml` file, what determines whether I'm opting in to null safety?在没有 `pubspec.yaml` 文件的情况下,是什么决定了我是否选择了 null 安全性?
【发布时间】:2021-09-20 16:20:59
【问题描述】:

我知道如果我先cd /tmp 然后dart create code,我会在/tmp/code/pubspec.yaml 中得到environment:<newline> sdk: '>=2.10.0 <3.0.0',这告诉我即使我运行的是 Dart v. 2.12.3,这个(默认)配置确实默认情况下不选择 null 安全性。

但是如果我创建一个空目录(mkdir /tmp/code),生成一个单行程序(echo "String a; " > /tmp/code/prog.dart),chdir(cd /tmp/code),然后运行(dart prog.dart),dart 会在哪里寻找@ 987654330@和package_config.json?

更新

我开始怀疑缺少 pubspec.yaml 不是 Dart 编程的认可用例。 pubspec.yaml 的存在是可以安装软件包的唯一方式,例如 (dart pub add <package-name>)。我得到的赎金结果(一个目录中的安全性为零;另一个目录中没有)仍然是一个谜,但如果pubspec.yaml 被省略,那么一致性可能就太高了。

【问题讨论】:

  • 空安全是可选的。选择加入的机制是将 Dart 2.12(或更高版本)设置为 pubspec.yaml 文件中所需的最低版本。否则,假定您打算让您的 Dart 代码与早期版本兼容。另见:stackoverflow.com/q/67045319
  • @jamesdlin 我明白了。我重新表述了这个问题以澄清。你能看到两个目录都缺少pubspec.yaml 文件,在一种情况下会触发错误(因此选择空安全),而在另一种情况下不会触发错误(选择退出)?

标签: dart dart-null-safety


【解决方案1】:

.dart_tool/package_config.json 文件中标记的语言版本决定了您是否具有空安全性。如果您的包的语言版本是 2.12 或更高版本,则启用 null 安全性。

当您运行 dart pub getdart pub upgrade 时,Pub 会根据您的 pubspec.yaml 文件和已解析依赖项的 pubspec 文件生成该文件。

每个 Dart 库都可以通过在库开头添加 //@dart=2.9 注释来覆盖该库的语言版本(以及库的每个部件文件,如果它使用部件)。

如果您没有package_config.json 文件,当前 默认是查找旧式.packages 文件。如果找到,所有语言版本都设置为2.7,即引入package_config.json文件和语言版本控制之前的SDK语言版本。 Dart 最终会停止寻找这个旧文件。

(在您正在运行的 Dart 文件的目录中搜索 .dart_tool 库和 .packages 文件,然后在此文件的每个父目录中搜索,直到找到根目录或找到某些内容。

如果也没有找到.packages 文件,则默认您使用的是编译器支持的最新 语言版本。 这可能意味着启用了空安全。您可以使用 //@dart=2.9 评论禁用它(以及所有其他以后的语言功能)。

【讨论】:

  • 我仍然缺少一些东西。我重新表述了这个问题。你能澄清一下 Dart 在哪里寻找 .dart_data/package_config.jsonpackage_config.json 吗?
  • 添加描述,并修正名称中的错字,实际上是.dart_tool/
猜你喜欢
  • 2022-01-24
  • 1970-01-01
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-21
相关资源
最近更新 更多