2009-09-30 64 views
7

我正在嘗試設置一個用Perl編寫的大型項目。到目前爲止,IBM MakeMaker tutorial一直非常有幫助,但我不明白如何將所有模塊鏈接到主程序中。在我的項目根目錄中,我有MANIFEST,Makefile.PL,README,bin目錄和lib目錄。在我的bin目錄中,我有我的主要腳本(Main.pl)。在lib目錄中,我將每個模塊分成了各自的目錄(即utils目錄中的Utils::Util1Utils::Utils2等)。在每個模塊目錄中,還有一個t目錄,包含測試如何開始一個新的Perl模塊分發?

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時,它說​​。任何人都可以提出建議嗎?我從來沒有在perl中做過這樣的大型項目,我還需要添加更多的模塊。

+1

我希望你的「Utils :: Util1」和「Utils :: Util2」僅僅是示例名稱。 – innaM 2009-09-30 05:45:36

+0

它們只是示例名稱。我還沒有寫出所有需要的模塊,但我希望能夠構建一些東西。 – Tim 2009-09-30 14:03:18

回答

5

試試這個結構:

bin/Main.pl 
lib/Utils/Util1.pm 
lib/Utils/Util2.pm 
Makefile.PL 
MANIFEST 
README 
t/Utils1.t 
t/Utils2.t 

正如YSTH說,make不安裝你的模塊,它只是建立他們在blib目錄。 (在你的情況下,它只是將它們複製到那裏,但如果你有XS代碼,它將用C編譯器編譯。)使用make install來安裝你的模塊以供常規腳本使用。

如果你想運行makemake install之間你的腳本,你可以這樣做:

perl -Mblib bin/Main.pl 

-Mblib指示的Perl到相應的目錄臨時添加到搜索路徑,所以你可以嘗試卸載的模塊。 (make test會自動執行此操作。)

2

默認情況下,測試是在頂層t目錄(或test.pl文件)中查找的,但是有一些限制,所以應該避免)。

你說「在我製作並運行後......」將東西放入準備安裝的blib目錄結構中,但沒有做任何特殊的事情來使運行腳本訪問它們。 (使測試是特殊的;它確實添加了從blib到perl的@INC的適當路徑,以便能夠運行測試)。您需要執行「make install」來安裝模塊,以便腳本可以找到它們(或者使用像PAR這樣的工具將它們與您的腳本一起打包)。

9

也許我也建議module-starter?它會自動創建一個「Just Works」的框架項目。通過閱讀生成的骨架文件,我學到了關於Perl模塊組織的知識。它們都有詳細的文檔記錄,並且很容易用作發展更大項目的基地。您可以查看the getting-started docs以查看它提供了什麼。

運行module-starter會給你一個Perl分佈,由多個模塊中的(使用命令行選項--module,如:

module-starter --distro=Project --module=Project::Module::A,Project::Module::B [...] 

創建在一個單一的分配多個模塊)。然後,您是否願意將您的項目組織爲由多個模塊一起工作的單個分發版本,或者作爲可以單獨發佈但相互依賴的多個分發版本(如在Build中配置的那樣)或Makefile.PL文件)來提供一個完整的系統。

+0

謝謝。我通讀了這篇文章,並且找不到任何關於做項目的事情,僅僅關於製作模塊。 – Tim 2009-09-30 14:04:04

+0

Tim:我修改了我的答案,以澄清發行版和模塊如何在Perl中一起工作。希望能幫助到你?如果我們中的一個人仍然感到困惑,請修改您的問題或再次回覆:)。 – Gaurav 2009-10-01 05:32:31

+0

這似乎是一個非常好的主意,我將不得不將它用於我的下一個項目。我已經建立了一個makemaker項目,但是這比我的初始文章更好地回答了我的問題 – Tim 2009-10-01 14:33:13

13

如果您剛剛開始創建Perl模塊(這也是Perl的項目對等項),請勿使用Makemaker。 Module::Build是要走的路,它現在是標準庫的一部分。 Makemaker對我們來說還沒有轉換爲Module :: Build的老鹽。 :)我現在就打那個Module::Build沒有維護和失寵;我仍然使用MakeMaker。

您不應該試圖通過嘗試自己創建結構來啓動Perl項目。這是太多的工作,你會永遠忘記一些東西。

h2xs,附帶perl,被認爲是對.H文件轉換成Perl的膠水語言XS的工具程序。它工作正常,但它的優勢在於它帶有perl

% h2xs -AXn Module::Name 

Module::Starter東西是更復雜一點,但你必須從CPAN得到它。這是我們在Intermediate Perl中使用的工具,因爲它很簡單。它填補了你的信息的一些模板:

% module-starter --author=... --email=... --module=... 

如果你正在做這樣做相當多,你可能會然後再轉換到Distribution::Cooker所以你可以定製你的文件和內容。這是我爲自己寫的一個簡單的工具,所以我可以使用自己的模板。

% dist_cooker Module::Name 

如果你真的硬核,您可能希望Dist::Zilla,但是這更多的誰已經知道他們在做什麼的人。