【问题标题】:Dart pub global run can't resolve script nameDart pub 全局运行无法解析脚本名称
【发布时间】: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

有没有办法获取当前正在运行的脚本的绝对路径,而不管它是如何执行的?

【问题讨论】:

    标签: dart


    【解决方案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 文件中。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-17
    • 2015-11-08
    • 2012-01-06
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    • 2018-10-08
    • 1970-01-01
    相关资源
    最近更新 更多