在没有 `pubspec.yaml` 文件的情况下,什么决定了我是否选择加入空安全?

In the absence of a `pubspec.yaml` file, what determines whether I'm opting in to null safety?

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

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

更新

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

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

当您 运行 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_tool 库和 .packages 文件在你正在 运行 的 Dart 文件的目录中搜索,然后在每个父目录中搜索,直到到达根,或直到找到东西)。

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