2016-01-25 20 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