2016-01-25 62 views
3

我有一個簡單的dart項目,它在bin文件夾(test.dart)中有一個可執行文件。我已經用dart global activate激活了它,現在我可以直接輸入該可執行文件的名稱來運行它。Dart pub全局運行無法解析腳本名稱

在那個dart文件裏我想知道那個腳本的路徑。基本上,現在我只是印刷是這樣的:

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艾美結果:

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() { ... } 

不是特別漂亮,但很容易剛投入一個實用程序文件。

+0

參見:https://github.com/dart-lang/dart_style/blob/154fecd4b686da2ca9a27166a9b17b599c0bf018/test/utils.dart#L24 –

+0

感謝您的幫助,但這只是讓我相對路徑,這在我的情況是不夠。 – x3derr8

2

tl; dr:有沒有一個偉大的方式做你想做的事情,但它的作品。

「當前正在運行的腳本的路徑」的概念比初看起來更復雜。 Dart生態系統調用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