Пакет компилируется частично? Как это предотвратить? - PullRequest
4 голосов
/ 23 апреля 2020

У меня есть код (некоторые строки удалены):

package MaitreD::Command::bank_statement;
use Mojo::Base 'Mojolicious::Command';

sub run {
    ...
    my $payments =  read_file( $file );   # line 58
    ...
}

use XBase;                                # line 174
sub read_file {
    ...
}

1;

Я запускаю свое приложение. Затем выполните два http-запроса к этому приложению. Контроллер запускает эту команду как:

$c->app->commands->run( bank_statement => $upload );

Я получаю следующую ошибку (ожидается это):

Can't locate XBase.pm in @INC (you may need to install the XBase module) (@INC contains: /opt/monkeyman/lib /opt/monkeyman/local/lib/perl5/x86_64-linux /opt/monkeyman/local/lib/perl5 /opt/monkeyman/lib /opt/monkeyman/local/lib/perl5/5.24.1/x86_64-linux /opt/monkeyman/local/lib/perl5/5.24.1 /opt/monkeyman/local/lib/perl5/x86_64-linux /opt/monkeyman/local/lib/perl5 /opt/perlbrew/perls/perl-5.24.1/lib/site_perl/5.24.1/x86_64-linux /opt/perlbrew/perls/perl-5.24.1/lib/site_perl/5.24.1 /opt/perlbrew/perls/perl-5.24.1/lib/5.24.1/x86_64-linux /opt/perlbrew/perls/perl-5.24.1/lib/5.24.1 .) at /opt/monkeyman/lib/MaitreD/Command/bank_statement.pm line 174.
BEGIN failed--compilation aborted at /opt/monkeyman/lib/MaitreD/Command/bank_statement.pm line 174.
Compilation failed in require at (eval 2620) line 1.

Но когда я сделал второй запрос, я получил другую ошибку:

Undefined subroutine &MaitreD::Command::bank_statement::read_file called at /opt/monkeyman/lib/MaitreD/Command/bank_statement.pm line 58.

Как можно запустить MaitreD::Command::bank_statement::run из контроллера, если компиляция модуля MaitreD::Command::bank_statement не удалась?

Если все правильно, модуль MaitreD::Command::bank_statement был частично скомпилирован в строку 174. Поэтому следующий http-запрос к приложению может вызвать MaitreD::Command::bank_statement::run, и когда будет достигнута строка 58, я получу Undefined subroutine &M::C::b::read_file called, потому что после строки 174 ничего не компилируется.

Как предотвратить частичную компиляцию? Я хочу, чтобы при возникновении ошибок ничего из MaitreD::Command::bank_statement не было доступно

1 Ответ

0 голосов
/ 28 апреля 2020

Кажется, вы должны сосредоточиться на том, чтобы use XBase действительно был успешным, потому что, предположительно, он существует по какой-то причине и необходим для работы остальной части программы.

Почему происходит сбой? Сначала исправьте это, и частичная компиляция не является проблемой.

В этом случае, почему perl не может найти модуль?

Возможно ли класс Command :: bank_statement isn 't use d напрямую, но только когда он запускается, поэтому, возможно, текущий рабочий каталог изменился между запуском программы и временем $c->app->commands->run( bank_statement => $upload ); вызова?

Если это так, попробуйте загрузить команду класс раньше. например, добавьте это в класс приложения Mojo (возможно, что-то вроде lib/MaitreD.pm:

use MaitreD::Command::bank_statement;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...