8

我需要找出 Dart 脚本(当前正在运行)所在的目录。我该怎么做呢?

以前,这可以通过 来实现new Options().script,但该类已不复存在。参数列表main(args)没有帮助,因为它只包含参数,而不是执行的 Dart 文件(至少在 Mac OS X 上)。

4

2 回答 2

5

根据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 中获取文件路径。

于 2013-11-11T14:29:37.427 回答
2

如前所述,简单的方法是:

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 执行 .dart

如果您从 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

如果您正在构建控制台应用程序,您可以使用 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
于 2021-09-30T22:59:08.457 回答