如何使用dart pub global run运行已激活Dart包的配置映射可执行脚本?
Dart包全局运行命令匹配逻辑说明
报错触发的根本原因
dart pub global run的参数解析逻辑,和你在pubspec.yaml中配置的executables映射规则完全独立,两者不存在联动关系:
- 你写的
executables: foo: bar配置,唯一作用是在全局激活包时生成启动脚本:将包内bin/bar.dart对应的启动脚本重命名为foo,当这个脚本所在目录被加入PATH后,直接输入foo就能启动对应程序。这个配置从设计上就不会反向修改dart pub global run的入口查找规则。 - 当你执行
dart pub global run foo bar时,工具会优先查找foo包的默认入口bin/foo.dart,再把后续的bar当成传给该入口的位置参数。因为你的包结构里不存在bin/foo.dart文件,所以才会触发Could not find bin/foo.dart的报错。
不依赖PATH的正确运行方式
不需要把包目录加入环境变量的前提下,可直接通过语法指定要运行的入口文件:
- 如果要运行
bin/bar.dart脚本,使用冒号分隔的指定入口格式执行对应命令:dart pub global run foo:bar
这个命令会直接定位到foo包下的bin/bar.dart入口执行,完全绕开默认入口的查找逻辑,不受PATH配置限制。 - 如果你确实希望
dart pub global run foo bar这种无冒号的命令格式能正常运行,只需要在包内补建默认入口文件bin/foo.dart即可。此时命令会正常定位到该默认入口,后续跟的bar字符串会作为运行参数传入bin/foo.dart中执行。
逻辑补充
dart pub global run的可执行入口识别规则为:包内bin/目录下的所有文件,只要去掉.dart后缀后的名称,都可以通过<包名>:<文件去掉后缀的名称>的格式直接指定运行。这个识别过程完全不读取pubspec.yaml中的可执行别名配置,只要对应文件存在就能正常运行,这也是你之前觉得foo:bar的运行方式和executables配置无关的根本原因。
内容的提问来源于stack exchange,提问作者iDecode
相关产品推荐
相关产品推荐

