如何在不修改build.rakumod的前提下创建带选项的install CLI工具?
问题背景
在build.rakumod中定义了多个multi sub MAIN( ... )子例程,其中一个如下:
multi sub MAIN( :$config = 'config', #= localised config file Bool :install($)!, #= install a config directory (if absent) from default values ) { .... }
同时有命令行工具bin/build,内容为:
#! /usr/bin/env raku use build
该工具可通过build命令搭配参数使用,现在希望新增CLI命令install,支持两种调用方式:
installinstall --config=konf
要求**不修改build.rakumod**的前提下编写bin/install,此前尝试两种方法均失败:
- 直接调用MAIN:
#! /usr/bin/env raku use build; MAIN(:install)
- 通过
use传递install:
use build :install
(此方法无效,因该语法用于标签,文档提及ARGS-TO-CAPTURE子例程,但不清楚如何使用)
解决方案
可以通过修改@*ARGS数组模拟命令行参数,再触发MAIN的标准参数解析逻辑,编写bin/install内容如下:
#! /usr/bin/env raku use build; # 强制添加--install参数,同时保留用户传入的其他参数 @*ARGS = '--install', |@*ARGS; # 调用Raku内置的MAIN参数处理入口 MAIN::CALL-MAIN();
逻辑说明
@*ARGS = '--install', |@*ARGS;:将--install作为固定前置参数,拼接用户传入的其他参数(如--config=konf),让MAIN能识别到:install标志已设置,同时正确接收--config参数。MAIN::CALL-MAIN():这是Raku处理MAIN子例程的标准入口,会自动解析@*ARGS并匹配对应的multi MAIN子例程。
测试验证
- 执行
install时,@*ARGS变为['--install'],匹配目标multi MAIN,使用默认config值。 - 执行
install --config=konf时,@*ARGS变为['--install', '--config=konf'],正确传递$config参数给MAIN。
注意:确保shebang行写为
#! /usr/bin/env raku(开头的斜杠不可省略),避免执行时出现路径错误。
内容的提问来源于stack exchange,提问作者Richard Hainsworth
相关产品推荐
相关产品推荐

