我想知道在 Raku 中创建 CLI 应用程序时推荐哪些步骤(例如 shebang 行和包装脚本)。我对将与 Zef 一起安装的脚本以及将单独分发的脚本的信息感兴趣。
文档提供了示例frobnicate
程序:
# inside "frobnicate.raku"
sub MAIN(Str $file where *.IO.f, Int :$length = 24, Bool :$verbose) { #`(body omitted)}
我可以运行它raku frobnicate.raku
——脚本的一个很好的解决方案,但对于一个真正的程序来说不是很好。
如果我想让它更像一个标准程序,我可以创建一个frobnicate
如下文件:
#!/usr/bin/env raku
sub MAIN(Str $file where *.IO.f, Int :$length = 24, Bool :$verbose) { #`(body omitted)}
我可以使该文件可执行chmod +x
并将其移动到我的目录中$PATH
;然后我可以用命令 frobnicate frobnicate
。到目前为止,所有这些都非常有意义,并且就像任何其他脚本语言一样。
然而,这一切都没有利用 Raku 的编译。因此,执行更多处理的 CLI 应用程序MAIN
可能会变得有点慢(即使是生成--help
输出)。因此,下一步是允许预编译该应用程序,但我不太确定如何执行此操作。
与泽夫
当我查看使用 Zef 安装 Raku 程序后执行的脚本时,它们几乎都具有以下形式:
#!/usr/bin/env perl6
sub MAIN(:$name, :$auth, :$ver, *@, *%) {
CompUnit::RepositoryRegistry.run-script("frobnicate", :$name, :$auth, :$ver);
}
而且,当我检查包的来源时,这CompUnit::RepositoryRegistry.run-script
条线不存在。所以我猜Zef添加了它?如果是这样,在编写脚本时我需要做些什么来确保 Zef 将使用此包装器并且包装器将起作用?
(这条评论有助于理解发生了什么,尽管我仍然不确定我 100% 明白)。
没有 Zef
我想编写用户无需通过 Zef 安装即可运行的脚本(尽管这是我推荐的安装方法)。有没有办法在run-script
没有 Zef 的情况下使用上面显示的方法?或者我应该做类似以下的事情,我也见过:
#!/usr/bin/env raku
use Frobnicate::CLI
(然后将实际功能移动到Frobnicate/CLI.rakumod
文件中)。
如果我走这条路,我需要指示用户下载frobnicate
上面的包装脚本和Frobnicate/CLI.rakumod
文件,对吗?(也就是说,没有办法在单个文件中执行此操作,是吗?)
假设我确实需要让我的用户下载两个文件,我应该让他们在哪里安装这些文件? frobnicate
需要进入他们的目录PATH
,但是呢Frobnicate/CLI.rakumod
?是否需要将其复制到他们的 Raku 模块搜索路径中(如果需要,什么命令会显示该路径是什么)?或者我可以frobnicate
以某种方式修改包装器(可能通过更改raku
为raku -Ilib
或类似的方式?),让他们将两者都安装到他们的目录中PATH
?
在把所有这些都打出来之后,我可能会觉得我在想这个问题。如果是这样,也请告诉我!无论如何,如果我能更好地理解这一点,我很乐意在文档的相关部分添加更多细节。