我需要找出 Dart 脚本(当前正在运行)所在的目录。我该怎么做呢?
以前,这可以通过 来实现new Options().script
,但该类已不复存在。参数列表main(args)
没有帮助,因为它只包含参数,而不是执行的 Dart 文件(至少在 Mac OS X 上)。
我需要找出 Dart 脚本(当前正在运行)所在的目录。我该怎么做呢?
以前,这可以通过 来实现new Options().script
,但该类已不复存在。参数列表main(args)
没有帮助,因为它只包含参数,而不是执行的 Dart 文件(至少在 Mac OS X 上)。
根据BREAKING CHANGE: dart:io Platform and Options are deprecated, and will be removed and Breaking Change: Platform.script is a Uri, dart:platform library is gone new Options().script
应该替换为Platform.script
.
请注意,它Platform.script
返回一个Uri,您应该考虑使用toFilePath从文件 URI 中获取文件路径。
如前所述,简单的方法是:
import 'dart:io';
print(Platform().script);
> file:///home/..../dcli_unit_tester/bin/dcli_unit_tester.dart
这是一个文件 url,因此要获取实际路径,请使用:
import 'dart:io';
print(Platform().script.toFilePath());
当然你想要目录而不是脚本,所以:
import 'dart:io';
import 'package:path/path.dart';
final pathToScript = Platform().script.toFilePath();
final pathToDirectory = dirname(pathToScript);
print(pathToDirectory);
> /home/..../dcli_unit_tester/bin
在尝试获取脚本目录时,您应该了解一些事项,因为目录会根据您运行脚本的方式而改变。
特别是如果从全局激活的包运行脚本,那么您可能不(不应该)想要使用脚本的目录来存储东西。
如果您从 cli 运行它,这是 Platform 的输出:
dart bin/dcli_unit_tester.dart -p
executable: dart
script: file:///home/..../dcli_unit_tester/bin/dcli_unit_tester.dart
现在,如果您从全局激活的包中运行相同的脚本:
pub global activate dcli_unit_tester
dcli_unit_tester -p
executable: dart
script: file:///home/..../.pub-cache/global_packages/dcli_unit_tester/bin/dcli_unit_tester.dart-2.14.2.snapshot
在这种情况下,目录位于 pub-cache 中,它本质上是暂时的,因此不要存储您以后想要取回的任何内容。
现在,如果您编译脚本:
dart compile exe bin/dcli_unit_tester.dart
bin/dcli_unit_tester.exe -p
executable: bin/dcli_unit_tester.exe
script: file:///home/..../dcli_unit_tester/bin/dcli_unit_tester.exe
如果您从单元测试运行相同的测试,则脚本将是 test.dll 文件而不是您的脚本。一旦我弄清楚在单元测试下运行时如何获取脚本目录(如果可能的话),我将更新这个答案。
如果您正在构建控制台应用程序,您可以使用 dcli 包:
import 'package:dcli/dcli.dart'
print(DartScript.self.pathToScript);
print(DartScript.self.pathToScriptDirectory);
> /home/..../dcli_unit_tester/bin/dcli_unit_tester.dart
> /home/..../dcli_unit_tester/bin