首先:raku (perl6) 很棒。克罗也是。只用了一个周末就坠入爱河。但是现在我偶然发现了一些必须非常简单的东西。
如果我在多分派 MAIN 中使用 slurpy 参数,则可以识别并完美运行:
multi MAIN( 'config', 'add', *@hostnames ) {
Run Code Online (Sandbox Code Playgroud)
但是,如果我将其设为非 slurpy 数组,则要么无法识别,要么我不知道如何从命令行提供它:
multi MAIN( 'config', 'add', @hostnames ) {
Run Code Online (Sandbox Code Playgroud)
我希望这些调用之一能够工作:
$ cli.raku config add www.example.com example.com
$ cli.raku config add www.example.com,example.com
$ cli.raku config add www.example.com, example.com
Run Code Online (Sandbox Code Playgroud)
Cro CLI 中使用了类似的构造,但是没有示例说明如何使用文档中的数组调用其中一个命令。
我也用一个数组作为命名参数尝试了这个:
my %*SUB-MAIN-OPTS = :named-anywhere;
multi MAIN( 'config', 'add', :@hostnames) {
Run Code Online (Sandbox Code Playgroud)
鉴于raku 文档中的示例,我希望它可以工作:
$ cli.raku config add --hostnames=www.example.com example.com
Run Code Online (Sandbox Code Playgroud)
但它没有,也没有逗号或空格逗号分隔的变体。在所有情况下,我都会获得使用信息。
multiple-dispatch command-line-interface named-parameters raku
当使用克罗马与HTTP1.1我可以通过这两个主机的方法访问请求的主机request.uri.host在克罗马::乌里权威标头中发送的浏览器通过:以及主机或request.header在方法克罗马:: HTTP ::请求。
但是,当我使用 HTTP/2 时,这些都不起作用。Uri 对象仅包含架构和路径。
我正在使用带有子域通配符的官方证书,并通过将这些子域添加到我的主机文件来在本地运行它。Chrome DevTools 说它已经在 HTTP/2 下发送了 :authority 请求标头,Firefox Developer Tools 说它已经在 HTTP/2 下发送了 Host 请求标头。但是,如果我将标头写入如下所示的日志,我会看到几个标头,但看不到 Host 或 :authority 标头。
sub routes() is export {
route {
get -> {
my $log = "/data/myapp/logs/cro.log";
my $fh = open $log, :w;
my $host = request.uri.host;
$fh.say( "Host with host method: " ~ $host );
$host = request.header('Host');
$fh.say( "Host: " ~ $host );
$host = request.header(':authority');
$fh.say(":authority: " …Run Code Online (Sandbox Code Playgroud) 鉴于文档和对较早问题的评论,根据要求,我制作了一个最小的可重现示例,演示了这两个语句之间的区别:
my %*SUB-MAIN-OPTS = :named-anywhere;
PROCESS::<%SUB-MAIN-OPTS><named-anywhere> = True;
Run Code Online (Sandbox Code Playgroud)
给定一个只有这个的脚本文件:
#!/usr/bin/env raku
use MyApp::Tools::CLI;
Run Code Online (Sandbox Code Playgroud)
以及 MyApp/Tools 中名为 CLI.pm6 的模块文件:
#PROCESS::<%SUB-MAIN-OPTS><named-anywhere> = True;
my %*SUB-MAIN-OPTS = :named-anywhere;
proto MAIN(|) is export {*}
multi MAIN( 'add', :h( :$hostnames ) ) {
for @$hostnames -> $host {
say $host;
}
}
multi MAIN( 'remove', *@hostnames ) {
for @hostnames -> $host {
say $host;
}
}
Run Code Online (Sandbox Code Playgroud)
从命令行进行以下调用不会产生可识别的子例程,但会显示用法:
mre.raku add -h=localhost -h=test1
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,切换my %*SUB-MAIN-OPTS = :named-anywhere;为PROCESS::<%SUB-MAIN-OPTS><named-anywhere> = True; …