2016-01-25 4 views
3

У меня есть простой проект дарт, который имеет один исполняемый файл в папке bin (test.dart). Я активировал его при активации dart global, и теперь я могу запустить его напрямую, просто набрав имя этого исполняемого файла.Глобальный запуск Dart pub не может разрешить имя сценария

Внутри этого файла дротика я хотел бы знать путь к этому сценарию. В основном сейчас я просто печатать что-то вроде этого:

print('1: ' + Platform.script.toString()); 
print('2: ' + Platform.script.path); 
print('3: ' + Platform.executable); 
print('4: ' + Platform.packageRoot); 
print('5: ' + Platform.resolvedExecutable); 

Когда я запускаю его напрямую:

test 

или пабе:

pub global run test 

или даже с названием пакета:

pub global run test:test 

Я всегда получаю s AME результат:

1: http://localhost:53783/test.dart 
2: /test.dart 
3: E:\apps\dart-sdk\bin\dart 
4: 
5: E:\apps\dart-sdk\bin\dart.exe 

Проблема здесь в том, что я не могу получить абсолютный путь к файлу test.dart.

Когда я бегу это так:

dart /path/to/project/bin/test.dart 

Я получаю то, что мне нужно:

1: file:///E:/projects/dart/test/bin/test.dart 
2: /E:/projects/dart/test/bin/test.dart 
3: dart 
4: 
5: E:\apps\dart-sdk\bin\dart.exe 

Есть ли способ, как получить абсолютный путь для сценария, который в настоящее время работает, независимо от того, как он был выполнен?

ответ

1

Если вам нужен надежный способ доступа к текущему файлу во время работы в pub, вам необходимо использовать зеркала.

Вот использование образца с dartdoc испытаний - https://github.com/dart-lang/dartdoc/blob/41a5e4d3f6e0084a9bc2af80546da331789f410d/test/compare_output_test.dart#L17

import 'dart:mirrors'; 

Uri get _currentFileUri => 
    (reflect(main) as ClosureMirror).function.location.sourceUri; 

void main() { ... } 

Не особенно красивая, но это легко просто поместить в файл UTIL.

+0

Смотрите также: https://github.com/dart-lang/dart_style/blob/154fecd4b686da2ca9a27166a9b17b599c0bf018/test/utils.dart#L24 –

+0

Спасибо за помощь, но это только заставляет меня относительный путь, который в моем случае недостаточно. – x3derr8

2

tl; dr: Не существует отличного способа делать то, что вы хотите, но это в работах.

Понятие «путь для скрипта, который в настоящее время работает», сложнее, чем может показаться при первом румянце. Существует несколько способов, которыми экосистема Дарта вызывает main(). В верхней части головы, вот несколько:

  • Вручную запускать файл с dart.
  • Запуск файла в изоляторе.
  • Компиляция файла в моментальный снимок и либо его запуск вручную, либо его запуск в изоляторе.
  • Автоматическая компиляция файла в исполняемый файл с кешем и его выполнение либо в подпроцессе, либо в изоляторе.
  • Добавление скрипта-оболочки, который импортирует файл и вызывает main(), и либо работает в подпроцессе, либо в изоляторе.
  • Обслуживание файла через HTTP и его запуск либо в подпроцессе, либо в изоляторе.

В некоторых случаях «скрипт, который работает» на самом деле является оберткой, а не исходным файлом, автором которого вы являетесь. В других случаях это моментальный снимок, который может не иметь неотъемлемого знания файла, из которого он был создан. В других файлах файл был изменен трансформаторами, а фактический код Dart, который работает, вообще не находится на диске.

Я подозреваю, что вы действительно ищете не сам исполняемый URL, а расположение файлов вашего пакета. Мы работаем над набором API, которые сделают это возможным, а также пакетом resource, который предоставит хороший API для работы с ресурсами ваших пакетов.

До этого участка есть dart:mirrors взлом вы можете использовать. Если вы даете один из вашей библиотеки файлов явных библиотек тегов, скажу library my.cool.package, вы можете написать:

var libPath = currentMirrorSystem().findLibrary(#my.cool.package).uri.path; 

Это даст вам путь к вашей библиотеке, которую вы можете использовать, чтобы выяснить, где lib/ файлы вашего пакета живут ,

+0

Спасибо за хорошее объяснение! Я пробовал предлагаемое решение, но я могу получить только относительный путь, которого в моем случае недостаточно. Точнее, вы можете посмотреть здесь код: https://github.com/Medianova/project_builder Идея состоит в том, чтобы скопировать файлы шаблонов и папки в другое место, и я не могу этого сделать, если я Не знаю путь к файлам шаблонов. В этом случае мне не помогает релятивное расположение. – x3derr8

Смежные вопросы