我正在尝试建立一个用Perl编写的大型项目。IBM MakeMaker tutorial到目前为止非常有用,但是我不知道如何将所有模块链接到主程序中。在我的项目根目录中,我有MANIFEST
、Makefile.PL
、README
、bin
目录和lib
目录。在我的bin
目录中,我有我的主脚本(Main.pl
)。在lib
目录中,我有我的每个模块,它们被划分到各自的目录中(即utils
目录中的Utils::Util1
和Utils::Utils2
,等等)。在每个模块目录中,还有一个t
目录,包含测试
我的MANIFEST
文件包含以下内容:
bin/Main.pl
lib/Utils/Util1.pm
lib/Utils/Util2.pm
lib/Utils/t/Utils1.t
lib/Utils/t/Utils2.t
Makefile.PL
MANIFEST
README
Makefile.PL
为以下值:
use ExtUtils::MakeMaker;
WriteMakefile(
'NAME'=>'Foo',
'VERSION_FROM'=>'bin/Main.pl',
'PREREQ_PM'=>{
"XML::Simple"=> 2.18}, #The libraries that we need and their
#minimum version numbers
'EXE_FILES' =>[("bin/Main.pl")]
);
在我制作并运行之后,程序崩溃了,抱怨它找不到Utils::Util1
,当我运行' make test
时,它显示no tests defined
。有人能提供什么建议吗?我从来没有在Perl中做过这样的大规模项目,我需要添加更多的模块
4条答案
按热度按时间mepcadol1#
如果您刚刚开始创建Perl模块(它也是Perl的项目等价物),不要使用Makemaker。Module::Build是一种可行的方法,它现在是标准库的一部分。Makemaker是为我们这些还没有转换到Module::Build的老家伙准备的。:)我现在要强调的是,Module::Build是未维护的,不受欢迎;我仍然使用MakeMaker。
你永远不应该在Perl项目开始的时候尝试自己创建结构。这工作量太大,而且你总是会忘记一些东西。
h2xs
是perl
自带的一个程序,它被认为是一个将 .h 文件转换为Perl的粘合语言XS的工具,它运行得很好,但它的优势在于它是perl
自带的:类似Module::Starter的东西更复杂一些,尽管你必须从CPAN获得它。它是我们在Intermediate Perl中使用的工具,因为它很简单。它用你的信息填充一些模板:
如果你经常这样做,你可以把它转换成Distribution::Cooker,这样你就可以自定义你的文件和内容了。这是我为自己写的一个小工具,这样我就可以使用我自己的模板了。
如果你真的是铁杆,你可能会想要Dist::Zilla,但这是更多的人谁已经知道他们在做什么。
j13ufse22#
我还可以推荐
module-starter
吗?它会自动创建一个“Just Works”的框架项目。通过阅读生成的框架文件,我学到了我对Perl模块组织的一点了解。它都有很好的文档记录,并且很容易用作在中增长更大项目的基础。您可以查看the getting-started docs,看看它给您带来了什么。运行
module-starter
将为您提供一个Perl发行版,其中包含许多模块(使用命令行选项--module
,例如:在一个发行版中创建多个模块)。然后,您可以选择将项目组织为一个由多个模块组成的发行版,或者组织为多个可以单独发布但相互依赖的发行版(如
Build
或Makefile.PL
文件中的配置),以提供一个完整的系统。suzh9iv83#
尝试以下结构:
正如ysth所说,
make
不会安装您的模块,它只是在blib
目录中构建它们。(在您的情况下,它只是将它们复制到那里,但如果您有XS代码,它将使用C编译器编译。)使用make install
安装您的模块,以便常规脚本使用。如果要在
make
和make install
之间运行脚本,可以执行以下操作:-Mblib
命令perl临时将相应的目录添加到搜索路径中,这样您就可以尝试卸载的模块(make test
会自动执行此操作)。wrrgggsh4#
默认情况下,测试是在顶级t目录(或test.pl文件,但这有一些限制,所以应该避免)中查找的。
您可以说“在我制作并运行之后”...... make将内容放入一个准备安装的blib目录结构中,但并不做任何特殊的操作来使运行脚本访问它们。它确实添加了从blib到perl的@INC的适当路径以便能够运行测试。)您需要执行“make install”来将模块安装到脚本可以找到它们的位置(或者使用PAR之类的工具将它们与脚本打包在一起)。