【问题标题】:Can't find application class in @INC when starting Mojolicious-generated app启动 Mojolicious 生成的应用程序时在 @INC 中找不到应用程序类
【发布时间】:2019-10-12 13:28:32
【问题描述】:

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

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

我在项目目录根目录下运行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 帖子中所述),但这会产生与上述相同的错误。该命令是这样的:/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 运行。有人对此有深入了解吗?

【问题讨论】:

  • 我试过这个:: mojo generate app first-app 并得到错误Your application name has to be a well formed (CamelCase) Perl module name like "MyApp"。所以我再次尝试使用mojo generate app TestApp 并且成功了。然后我做了cd test_app 并运行morbo script/test_app 并且它有效(我在127.0.0.1:3000 获得了欢迎页面)我使用的是perl 5.28.1 版、Ubuntu 19.04、Mojolicious 8.14 版

标签: perl server mojolicious morbo


【解决方案1】:

要使您的设置正常工作,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 的经验。]

【讨论】:

  • 谢谢,用 PascalCase 命名它有效。在发布原始帖子之前,我之前尝试过 #1-3,但那时我仍然没有使用最佳命名实践。至于为什么它在生成应用命令期间没有出错,我不知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多