Dart pub 全局运行无法解析脚本名称
Posted
技术标签:
【中文标题】Dart pub 全局运行无法解析脚本名称【英文标题】:Dart pub global run can't resolve script name 【发布时间】:2016-05-01 05:02:32 【问题描述】:我有一个简单的 dart 项目,在 bin 文件夹 (test.dart) 中有一个可执行文件。我已经用 dart global activate 激活了它,现在我只需输入该可执行文件的名称即可直接运行它。
在该 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
我总是得到相同的结果:
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】:tl;dr:没有什么好方法可以做你想做的事,但它正在开发中。
“当前正在运行的脚本的路径”的概念比乍看起来要复杂得多。 Dart 生态系统可以通过多种方式调用main()
。在我的脑海中,这里有一些:
dart
手动运行文件。
在隔离中运行文件。
将文件编译为快照,然后手动运行或在隔离中运行。
自动将文件编译为缓存的可执行文件,并在子进程或隔离中运行。
添加一个用于导入文件并调用 main()
的包装脚本,并在子进程或隔离中运行该脚本。
通过 HTTP 提供文件,并在子进程或隔离中运行它。
在某些情况下,“正在运行的脚本”实际上是一个包装器,而不是您创作的原始文件。在其他情况下,它是一个快照,可能没有关于创建它的文件的固有知识。在其他情况下,文件已被转换器修改,实际运行的 Dart 代码根本不在磁盘上。
我怀疑您实际上要查找的不是可执行 URL 本身,而是您的包文件的位置。我们正在开发一系列 API 来实现这一点,以及一个 resource
包,它将提供一个很好的 API 来处理你的包资源。
在此之前,您可以使用 dart:mirrors
hack。如果你给你的一个库文件一个明确的库标签,比如library my.cool.package
,你可以写:
var libPath = currentMirrorSystem().findLibrary(#my.cool.package).uri.path;
这将为您提供库的路径,您可以使用它来确定您的包的 lib/
文件所在的位置。
【讨论】:
感谢您的精彩解释!我尝试了建议的解决方案,但我只能获得相对路径,在我的情况下这还不够。更准确地说,您可以在这里查看代码:github.com/Medianova/project_builder 想法是将模板文件和文件夹复制到其他位置,如果我不知道模板文件的路径,我将无法这样做。在这种情况下,相对位置对我没有帮助。【参考方案2】:如果您想在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 文件中。
【讨论】:
另见:github.com/dart-lang/dart_style/blob/… 感谢您的帮助,但这只会给我一个相对路径,在我的情况下这还不够。以上是关于Dart pub 全局运行无法解析脚本名称的主要内容,如果未能解决你的问题,请参考以下文章
Android Studio 无法解析 dart 文件中的嵌套导入
无法解析URL“ https://pub.dartlang.org”。错误(69):无法“发布升级”颤动工具。 5秒钟后重试…(还剩9次尝试)
无法解析 URL“https://pub.dartlang.org”。错误 (69):无法“发布升级”颤振工具。 5 秒后重试...(还剩 9 次尝试)