raku - 执行包函数的意外输出
问题描述
我有以下目录结构(重现问题的简化版本):
testing/
lib/
CLI.pm6
t/
01-test.t
您可以在此处查看来源。问题是,如果你运行raku -Ilib t/01-test.t
,你会得到以下输出:
ok 1 - show help message
1..1
ok 1 - no arguments provided
not ok 1 - long version
# Failed test 'long version'
# at site#sources\D2E3739A3B53AD1F7CFEE6DA262613FD174A0BC9 (Test::Output) line 84
# expected a match with: /Documentable\sversion/
# got: "version\r\n"
1..1
# You failed 1 test of 1
not ok 2 - version command
# Failed test 'version command'
# at t\01-test.t line 12
1..2
# You failed 1 test of 2
Execute "documentable --help" for more information.
一切看起来都很正常(显然测试失败了)。问题是最后一行:
Execute "documentable --help" for more information.
该行由添加CLI::MAIN()
,但在测试完成后不执行。您甚至可以评论第一个子测试块,它仍然会出现。这导致使用prove6 -l
. 知道发生了什么吗?
解决方案
更改use CLI;
为use CLI {}
。
问题
假设CLI
找到了包,运行这个:
use CLI;
将显示:
Execute "documentable --help" for more information.
意外输出
以上显然不是您想要的,但您的测试代码不会改变CLI
包的方式use
。所以应该预料到不需要的消息,因为它是按预期MAIN
工作的功能。[1]
一个办法
您的问题归结为:
如何在抑制这些 s 的自动运行的同时
use
使用导出的 s 包?MAIN
MAIN
一种简单的解决方案是不导入MAIN
(或者更确切地说&MAIN
[2]。)
一种方法是将 替换use CLI;
为use CLI {}
。
一个use CLI;
语句等价于use CLI :DEFAULT;
。(:DEFAULT
标签会选择上面有的所有东西,is export
而没有一些不同的标签。)
如果您use CLI {}
改为编写,则除了自身之外不会导入任何CLI
符号,这将绑定到以其包限定形式CLI
导出的符号。
这样你的手动测试MAIN
(指定包-- CLI::MAIN
)将继续工作,但它的自动调用将被禁止。
脚注
[1]如果文档没有说明清楚:
包
is export
中的声明our proto MAIN
导出一个[ 2]符号;CLI
&MAIN
该
use
语句将该符号导入的词法范围;&MAIN
t/01-test.t
该命令在没有参数的情况下
raku ... t/01-test.t
调用t/01-test.t
,就像那样prove6 -l ...
(假设没有超出 lib 的其他参数传递给主线)。因此调用了零参数&MAIN
调用;零参数调用解析为零参数
multi MAIN() { note 'Execute ... information'; }
声明。所以你看到了它的信息。
[2]像这样的子声明MAIN
声明了一个符号&MAIN
。(和子调用一样MAIN blah blah
调用与关联的例程&MAIN
。)
推荐阅读
- python-3.x - 如何在 Scikit-Learn 中获取 GridSearchCV() 的 OneVsRestClassifier(LinearSVC()) 的估计器键引用?
- reactjs - 失败的道具类型:ForwardRef(Button):道具类型`component`无效:React中带有材料ui的警告
- c# - 在 Windows 窗体属性中调整大小不起作用
- android - 我是否必须为打捞的 android 地图应用程序重新生成新的 SHA-1 密钥?
- php - 无法在构造函数中获取会话
- python-3.x - 您如何限制多个数字的输出中的小数位数?
- python - 读取并打印“STDIN 和 STDOUT”
- sql - 运行宏(特别是电子邮件)时如何更新字段(特别是日期)
- r - 使用 Reactive Directory 的 R 功能太慢
- java - React 和 Spring Boot 的 Oath2 实现