Не удается найти класс приложения в @INC при запуске приложения, созданного Mojolicious

Я создал мохолическое приложение с помощью команды mojo generate app first-app. Он сгенерировал структуру приложения, которая должна позволять запускать пример при запуске сервера разработки сmorbo ./script/first-app.

Файловая структура выглядит так:структура приложения mojo

Моя ошибка при запуске 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 (как упоминалось в сообщении SO 6-летней давности), но это дает ту же ошибку, что и выше. Эта команда была такой:/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 без проблем. Кто-нибудь знает об этом?

1 ответ

Решение

Чтобы ваша установка работала, first-app.pm должен содержать package first-app;, но это недопустимый код из-за тире. Хокон Хэгланд предполагает, чтоmojo generate app first-app не должно было работать (предположительно, чтобы избежать этой самой проблемы), поэтому неясно, как вы пришли к описанной вами настройке.

Чтобы устранить проблему, вы можете перезапустить mojo generate app с более подходящим именем (например, FirstApp) и начать заново.

В качестве альтернативы теоретически вы сможете решить проблему всего за три изменения:

  1. Переименовать lib/first-app.pm к более традиционному имени, например lib/FirstApp.pm.
  2. Измените аргумент, переданный в ->start_app к 'FirstApp'.
  3. Изменить package директива в теперь названном lib/FirstApp.pm к package FirstApp;.

Путь модуля, путь модуля package директива, а use оператор, используемый для загрузки модуля - значение, переданное в ->start_appв этом случае - все должно совпадать. Три изменения обеспечивают это для рассматриваемого модуля.

[Примечание: у меня нет опыта работы с Mojo.]

Другие вопросы по тегам