第五天 - 你应用程序的内置命令

img

我在本系列文章的开头提到,Mojolicious 应用程序不仅仅是 Web 服务器。然后,我展示了如何使用 daemon 守护程序或 prefork 命令启动 Web 服务器。在上一篇文章中,我提到了一个 inflate命令,它可以帮助您将应用程序从 Lite 增加到 Full。

但是,还有其他命令,内置在您的应用程序中,可以帮助您立即提高工作效率!

命令基础

在开始之前,我想简要讨论与 Mojolicious 发行版捆绑在一起的 mojo 应用程序/脚本。这个命令是一个很小的Mojolicious应用程序(实际上是另一个“hello world”),可以被认为是“空应用程序”。内置命令适用于您的应用程序和此null应用程序,因此请使用更合适的选项。当哪个应用程序运行命令无关紧要时,您可以使用 mojo

每个命令都带有一行描述和一个(可能是多行)用法语句。要查看可用命令,请运行 mojo help,您将看到所有命令及其说明。你应该看到这样的东西:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
$ mojo help
Usage: APPLICATION COMMAND [OPTIONS]

mojo version
mojo generate lite_app
./myapp.pl daemon -m production -l http://*:8080
./myapp.pl get /foo
./myapp.pl routes -v

Tip: CGI and PSGI environments can be automatically detected very often and
work without commands.

Options (for all commands):
-h, --help Get more information on a specific command
--home <path> Path to home directory of your application, defaults to
the value of MOJO_HOME or auto-detection
-m, --mode <name> Operating mode for your application, defaults to the
value of MOJO_MODE/PLACK_ENV or "development"

Commands:
cgi Start application with CGI
cpanify Upload distribution to CPAN
daemon Start application with HTTP and WebSocket server
eval Run code against application
generate Generate files and directories from templates
get Perform HTTP request
inflate Inflate embedded files to real files
prefork Start application with pre-forking HTTP and WebSocket server
psgi Start application with PSGI
routes Show available routes
test Run tests
version Show versions of available modules

See 'APPLICATION help COMMAND' for more information on a specific command.

如上所述,您现在可以通过为其中一个命令运行 mojo help COMMAND 来查看有关每个命令的更详细信息。

内置命名

由于我们已经简要讨论了 deployment ,这次我将跳过服务器,包括 cgipsgi 命令。同样,我将跳过 inflate 命令。为了空间的利益,我将跳过只运行应用程序测试的 test 命令,如 prove。我还将跳过 cpanify,让 CPAN 作者将模块上传到 CPAN(我一直使用它)。

generate 命令

也许您使用的第一个命令应该是 generate 命令。它允许您从模板生成新的应用程序(或其他)项目框架。

它有一些子命令,包括一个用于生成每种类型的应用程序的子命令。要创建 Lite 应用程序,请传递要创建的脚本的名称

1
$ mojo generate lite_app myapp.pl

要创建完整应用程序,请传递该类的名称

1
$ mojo generate app MyApp

您还可以创建插件项目生成 Makefile

关于文件生成的主题还有更多的说法,但由于这是一篇概述文章,我现在就把它留在那里。

version 命令

version 命令是一个简单的实用程序,用于检查 Mojolicious 安装。

它会输出您当前版本的 Perl 和 Mojolicious 以及任何已安装的可选库。例如,如果要通过 HTTPS 获取或提供站点,则需要安装 IO::Socket::SSL。然后检查是否有可用的 Mojolicious 更新版本。

routes 命令

一旦开始编写应用程序,您可能希望对其进行一些内省,尤其是出于调试目的。这种性质最直接的命令是 routes。只需在您的应用上运行它,看看您定义了哪些路由。

例如,我们可以从第3天开始在Santa的应用程序上运行它。

1
2
3
4
$ perl santa.pl routes
/toy/:toy_name GET "toy"
/meet/:name GET "staff"
/ GET "home"

这将显示已定义的三条路由。它显示了每个路由的路径,包括它们的占位符,所有三个路由都处理 GET,以及它们的路由名称。使用此输出在使用命名路由时尤其有用,正如我们在该帖子中所了解的那样;您需要的所有信息都在该表中!

我们可以更深入一点,并通过添加标志来请求详细输出

1
2
3
4
$ perl santa.pl routes -v
/toy/:toy_name .... GET "toy" ^\/toy/([^/.]+)/?(?:\.([^/]+))?$
/meet/:name .... GET "staff" ^\/meet/([^/.]+)/?(?:\.([^/]+))?$
/ .... GET "home" ^/?(?:\.([^/]+))?$

此输出包含与以前相同的所有内容,但这次它还添加了一些额外的项目。某些路由更复杂,虽然所有这些路由都很简单,因此没有显示任何标志,如果一个路由是 under 路由或者是一个 websocket,那么它将被 noted….最后,它包含一个与路由实际匹配的模式。在调试某些请求与特定路由匹配(或更可能不匹配)的原因时,这有时会很有帮助。请注意,路由按顺序从上到下检查每个路由,第一个匹配是使用的。

get 命令

现在我们开始有趣了!

Mojolicious 附带了一个 user agent 和许多后处理功能,包括 HTML/XMLJSON 解析器。此命令在命令行上一起暴露这些功能,如 cURL 或 wget 的智能版本。

输出将写入 STDOUT,以便您可以根据需要将结果重定向到文件。因此,除非传递 -v,否则将从输出中省略标题。

让我们看看它能做些什么!您可以使用 Meta::CPAN JSON API 找到最新版本的 IO::Socket::SSL。响应被解析为 JSON,只输出 version 元素。

1
mojo get https://fastapi.metacpan.org/v1/module/IO::Socket::SSL /version

您可以从 reddit 获取 Perl 标题。为此,我们获取 url(使用 -r 重定向后),然后我们给它一个 CSS3选择器,最后从每个找到的元素中提取文本。

1
mojo get -r reddit.com/r/perl 'p.title > a.title' text

这有多有趣?!

  • 您可以 POST 或 PUT 或 DELETE 数据
  • 它使用 URL 中的 username:password 处理 HTTP 基本身份验证
  • 您可以使用标准的 @filename 语法提交表单,甚至是文件上传
  • 如果您只想发送文件的原始内容而不是对其进行 url-encode,则可以将数据传递给命令
  • 请参阅文档中的更多示例

但我还没有触及其最酷的功能。当您请求相对 URL 时,此命令也适用于您的应用程序。这对于快速开发期间的调试请求非常方便;你甚至不需要浏览器!

1
perl santa.pl get /meet/rudolph 'p' text

eval 命令

最后在这次旋风之旅中,我会告诉你我最喜欢的命令。 eval 命令。此命令具有使用您的应用程序运行一次性命令的神奇力量!该应用程序可在您的单行中作为 app 提供。

所以说你无法弄清楚你的配置有什么问题,只要求它转储它认为它的配置是什么

1
2
perl myapp.pl eval -v 'app->home'
perl myapp.pl eval -V 'app->config'

-v 标志将最后一个语句的字符串结果打印到 STDOUT,-V 标志对数据结构执行相同的操作。也许你想知道它为什么找不到你的模板。

1
perl myapp.pl eval -V 'app->renderer->paths'

一旦通过某个模型层设置了数据库交互,这一点尤其有用。如果要查看某些查询的结果,请检查。

1
perl myapp.pl eval -V 'app->model->users->find({name => "Joel"})'

当然,这取决于模型层的工作方式。或者您可能希望部署架构或将其回滚。

1
perl myapp.pl eval 'app->pg->migrations->migrate'

或者只是检查数据库是否可访问。

1
perl myapp.pl eval -V 'app->pg->db->query("SELECT NOW()")->hash'

最后两个数据库示例假设您的应用程序正在使用 Mojo::Pg,但类似的单行程序可以适用于您的应用程序所知道的任何数据库。

实际上没有什么比调试或管理应用程序更简单,无需将一堆逻辑从应用程序复制并粘贴到某个脚本中。虽然如果你真的发现自己经常使用 eval 命令执行相同的任务……那么应该等到明天。