包是否会部分编译?如何防止这种情况发生?

问题描述 投票:4回答:1

我有代码(有些行被删除)。

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请求。Controller运行这个命令为。

$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行。所以,下一个对app的http请求可以调用 MaitreD::Command::bank_statement::run 当到达58线时,我得到 Undefined subroutine &M::C::b::read_file called 因为174行之后没有任何东西被编译。

如何防止部分编译?我想如果有一些错误发生,那么就不会有任何东西从 MaitreD::Command::bank_statement 应有尽有

perl
1个回答
0
投票

看来你应该把重点放在确保 use XBase 实际上是成功的,因为它的存在大概是有原因的,它是程序其他部分工作所需要的。

为什么会失败?先解决这个问题,部分编译就不是问题了。

在这种情况下,为什么perl找不到模块?

是不是Command::bank_statement类不在 used直接运行,但只有在运行的时候才会出现,所以可能在程序启动和运行的时候,当前的工作目录发生了变化 $c->app->commands->run( bank_statement => $upload ); 被调用了?

如果是这样的话,请尝试早些时候加载命令类,例如,将此添加到Mojo应用类中(可能是类似于 lib/MaitreD.pm:

use MaitreD::Command::bank_statement;

© www.soinside.com 2019 - 2024. All rights reserved.