无法在@INC 中找到 MyApp/Schema.pm

Can't locate MyApp/Schema.pm in @INC

我正在尝试使用 perl 连接到数据库。我尝试按照本教程 https://metacpan.org/pod/release/RIBASUSHI/DBIx-Class-0.082840/lib/DBIx/Class.pod 并创建一个名为 MyApp 的简单应用程序,并完全按照他们所做的那样创建文件,但是当我编译 CD.pm 文件时,我收到错误 Can't locate MyApp/Schema.pm in @INC (你可能需要安装MyApp::Schema模块).

程序看起来像 Atom 中的程序,使用脚本包 运行 ubuntu 上的代码:

MyApp---
     |  |
     |  Schema--
     |         |
     |          Result-----
     |                |    |
     |       Artist.pm     CD.pm
     |
Schema.pm


#Schema.pm
package MyApp::Schema;
use base qw/DBIx::Class::Schema/;

__PACKAGE__->load_namespaces();

1;
#CD.pm
package MyApp::Schema::Result::CD;
use base qw/DBIx::Class::Core/;

__PACKAGE__->load_components(qw/InflateColumn::DateTime/);
__PACKAGE__->table('cd');
__PACKAGE__->add_columns(qw/ cdid artistid title year /);
__PACKAGE__->set_primary_key('cdid');
__PACKAGE__->belongs_to(artist => 'MyApp::Schema::Result::Artist', 'artistid');

 1;
#Artist.pm
package MyApp::Schema::Result::Artist;
use base qw/DBIx::Class::Core/;

__PACKAGE__->table('artist');
__PACKAGE__->add_columns(qw/ artistid name /);
__PACKAGE__->set_primary_key('artistid');
__PACKAGE__->has_many(cds => 'MyApp::Schema::Result::CD', 'artistid');

1;

I am new in creating the back-end side for a web page so I don't know what I am doing

如果是这样,那么我真的认为构建一个使用 DBIx::Class 的应用程序对于您的第一次尝试来说有点困难。我建议先花一些时间掌握使用 Perl 编写 command-line 程序。

但这可能是不可能的。在这种情况下,请继续阅读...

您没有向我们提供您收到的完整错误消息(并且,为了将来参考,这将非常有用)但我怀疑它会继续告诉您目录列表目前在 @INC.

当 Perl 加载模块时,它需要知道在哪里可以找到包含该模块的文件。它通过使用一个名为 @INC 的特殊数组变量来做到这一点。 @INC 包含 Perl 应搜索以查找模块代码的所有目录的列表。在设置 Perl 安装时,有许多目录 "baked-in",但有多种方法可以添加到该列表。

您的错误消息将为您提供 @INC 中的当前目录列表,但您也可以从这个简单的 command-line Perl 程序中获取它:

perl -E'say for @INC'

该列表包含我之前提到的 "baked-in" 目录。这些是 Perl 期望找到模块的标准目录。但是作为应用程序一部分的模块(MyApp::Schema 模块)并未存储在这些目录中。它们与您的程序位于同一目录树中。

在旧版本的 Perl 中,当前目录会自动添加到 @INC(您会看到“.”包含在我上面提到的程序的输出中)但这被视为安全风险所以它已被删除(这就是 ikegami 将您指向 的原因)。

所以我们需要将当前目录添加到@INC。我们可以使用 lib 编译指示将目录添加到 @INC。最简单的选择是将此行添加到程序顶部附近(use MyApp::Schema 行之前):

[注意: 当前目录已从默认目录 @INC 中删除,原因非常充分。而下面的代码行只是撤销了 Perl 开发团队通过删除它所做的良好工作。正如我上面所说,这当然是最简单的选择,但这也是一个非常愚蠢的想法。]

# Don't do this. Use the next code block instead.
use lib '.';

但是,如果您 运行 您的程序来自其所在目录以外的其他地方,那将行不通。所以更稳健的解决方案是:

use FindBin '$RealBin';
use lib $RealBin;

如果这不起作用,则可能是您将库放在不同的目录结构中,我们需要更多信息。