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 次尝试)

错误:无法在 Flutter 中解析包名称