启动 Mojolicious 生成的应用程序时,无法在@INC 中找到应用程序 class

Can't find application class in @INC when starting Mojolicious-generated app

我使用命令 mojo generate app first-app 生成了一个有趣的应用程序。当 运行 使用 morbo ./script/first-app 连接开发服务器时,它生成的应用程序结构应该允许 运行ning 示例。

文件结构如下所示: mojo app structure

我在项目根目录下运行ning morbo ./script/first-app时的错误是这个错误:

Can't load application from file "/home/djnorrisdev/Documents/mojo-practice/first-app/script/first-app":
    Can't find application class "first-app" in @INC. (
    /home/djnorrisdev/Documents/mojo-practice/first-app/lib
    /home/djnorrisdev/perl5/perlbrew/perls/perl-5.30.0/lib/site_perl/5.30.0/x86_64-linux
    /home/djnorrisdev/perl5/perlbrew/perls/perl-5.30.0/lib/site_perl/5.30.0
    /home/djnorrisdev/perl5/perlbrew/perls/perl-5.30.0/lib/5.30.0/x86_64-linux
    /home/djnorrisdev/perl5/perlbrew/perls/perl-5.30.0/lib/5.30.0)
Compilation failed in require at (eval 72) line 1

(为便于阅读而添加的换行符。缩进行是上一行的延续。)

我尝试使用 morbo 的完整路径(如 6 岁的 SO post 中所述),但这会产生与上述相同的错误。该命令是这样的:/home/djnorrisdev/perl5/perlbrew/pls/perl-5.30.0/bin/morbo ./script/first-app

我猜任何熟悉完整 mojolicious 应用程序的人都会熟悉脚本文件,但这里是 script/first-app 的内容:

#!/usr/bin/env perl

use strict;
use warnings;

use Mojo::File 'curfile';
use lib curfile->dirname->sibling('lib')->to_string;
use Mojolicious::Commands;

# Start command line interface for application
Mojolicious::Commands->start_app('first-app');

考虑到这是一个 mojolicious 生成的应用程序,我认为它不应该出现 @INC 错误并且 运行 morbo 没有问题。有没有人对此有所了解?

要让您的设置生效,first-app.pm 必须包含 package first-app;,但由于破折号的缘故,这不是合法代码。 Håkon Hægland 建议 mojo generate app first-app 不应该起作用(大概是为了避免这个问题),所以不清楚你是如何得到你描述的设置的。

要解决此问题,您可以使用更合适的名称(例如 FirstApp)重新运行 mojo generate app,然后重新开始。

或者,从理论上讲,您应该只需更改三处即可解决问题:

  1. lib/first-app.pm 重命名为更常规的名称,例如 lib/FirstApp.pm
  2. 将传递给 ->start_app 的参数更改为 'FirstApp'
  3. 将现在命名为 lib/FirstApp.pmpackage 指令更改为 package FirstApp;

模块的路径、模块的 package 指令和用于加载模块的 use 语句(在本例中传递给 ->start_app 的值)必须全部匹配。这三个更改确保了相关模块的这一点。

[注意:我没有使用 Mojo 的经验。]