Я хочу знать, что такое каталог сценария. У меня есть скрипт Dart для командной строки.
Как получить каталог текущего скрипта в Dart?
Ответы (4)
Если вы делаете это для консольного приложения (например, в модульном тесте) и собираетесь использовать вывод, чтобы открыть файл для чтения или записи, более полезно использовать Platform.script.path
:
import "package:path/path.dart" show dirname, join;
import 'dart:io' show Platform;
main() {
print(join(dirname(Platform.script.path), 'test_data_file.dat'));
}
Результат этой команды можно использовать с объектом File
и открыть/прочитать (например, если у вас есть модульный тест, который должен читать/сравнивать образцы данных, или консольная программа, которой нужно открыть файл относительно текущего скрипта для какая-то другая причина).
Самый простой способ найти каталог скрипта — использовать пакет path.
import "package:path/path.dart" show dirname;
import 'dart:io' show Platform;
main() {
print(dirname(Platform.script.toString()));
}
Поместите пакет пути в свой pubspec.yaml:
dependencies:
path: any
И обязательно запустите pub get
, чтобы загрузить и связать пакет пути.
file://
. Небольшое улучшение для меня заключалось в том, чтобы вместо этого использовать Platform.script.path
.
- person tishma; 11.04.2018
Использование Platform.script.path работает не во всех случаях.
Если ваш скрипт скомпилирован или запущен как модульный тест, вы не получите ожидаемых результатов.
Это из проекта dcli (https://pub.dev/packages/dcli)
Если вы используете dcli, вы можете позвонить:
// absolute path including the script name
Script.current.pathToScript;
or
// just the absolute path to the script's directory
Script.current.pathToScriptDirectory;
Этот код работает, если скрипт запускается через dart ‹scriptname.dart›, если вы компилируете скрипт или если ваш скрипт является модульным тестом.
Вот внутренняя реализация.
static String get _pathToCurrentScript {
if (_current == null) {
final script = Platform.script;
String _pathToScript;
if (script.isScheme('file')) {
_pathToScript = Platform.script.toFilePath();
if (_isCompiled) {
_pathToScript = Platform.resolvedExecutable;
}
} else {
/// when running in a unit test we can end up with a 'data' scheme
if (script.isScheme('data')) {
final start = script.path.indexOf('file:');
final end = script.path.lastIndexOf('.dart');
final fileUri = script.path.substring(start, end + 5);
/// now parse the remaining uri to a path.
_pathToScript = Uri.parse(fileUri).toFilePath();
}
}
return _pathToScript;
} else {
return _current.pathToScript;
}
}
static bool get _isCompiled =>
basename(Platform.resolvedExecutable) ==
basename(Platform.script.path);
Другой (хотя и хакерский) способ определить путь к текущему .dart
файлу — извлечь путь из трассировки стека.
В отличие от Platform.script.path
, это должно работать с модульными тестами:
import 'package:stack_trace/stack_trace.dart' as stacktrace;
String currentDartFilePath() => stacktrace.Frame.caller(1).library;
Обратите внимание, что это вернет путь относительно (я думаю) корня пакета вызывающего.
Если вам нужен только каталог, вы можете выполнить типичные операции манипуляции с результатом.