2014-04-23 83 views
1

我有一系列perl腳本,我正在編寫Makefile.PL腳本,但我對ExtUtils::MakeMaker沒有經驗。如何在perl的ExtUtils中處理外部依賴關係:MakeMaker

我編寫的腳本之一會對命令行實用程序進行系統調用,必須安裝該實用程序才能使腳本正常運行。我的腳本可以正常檢測到該實用程序丟失,併發出有關安裝它並將其放入用戶路徑的錯誤,但是有沒有一些標準方法可以在Makefile.PL腳本中處理?如果我在Makefile.PL腳本中輸入下載鏈接,是否可以嘗試安裝第三方實用程序gasp

至少,我希望腳本警告用戶是否未找到外部依賴關係。我知道我可以編寫一個使用它的測試用例。這很簡單,就像複製和粘貼我在腳本中編寫的子程序一樣,該子程序檢查第三方實用程序,如果找不到或者是「錯誤的方法」,則會輸出錯誤信息?

+0

您需要的實用程序是什麼?由於perl獨立於平臺,因此如果您計劃將其添加到CPAN,則需要在所有平臺上都具有該實用程序。另一方面,可能會有一個perl的實用程序實現,然後您可以添加爲模塊依賴項 – KeepCalmAndCarryOn

+0

該實用程序是一個命令行實用程序,它具有大多數系統的二進制文件。它是稱爲肌肉的DNA和蛋白質序列的多序列比對器(http://www.drive5.com/muscle/downloads.htm)。我使用IPC :: Open3從我的腳本中調用它。不知道是否有一種檢查這種命令行依賴性的標準方法,我只是在Makefile.PL中創建了一個子文件,檢查它並在它不在用戶路徑中時發出警告。 – hepcat72

回答

0

如果您對命令行實用程序具有外部依賴關係(即沒有perl模塊執行該實用程序的功能),ExtUtils :: MakeMaker不是用來處理這種依賴關係的。你需要做的是寫一個安裝腳本或編輯make文件來處理依賴。這是考慮如下:

  1. 檢查依賴項是否存在以及版本是否足夠。
  2. 下載依賴包
  3. 配置,編譯&安裝依賴的包
  4. 測試,以確保它的工作原理
  5. 更新用戶的環境設置,如果有必要
  6. 運行您的perl軟件包的安裝步驟(例如Perl的makefile.PL;使;須藤使安裝)

注意,你可能需要知道你的腳本是作爲root運行與否,你可以驗證使用id -u檢查用戶ID是否是根(即, '0')。

+0

順便說一句,我提交了這個答案,因爲沒有人提供了一個解決方案。這基本上是我最終做到的,它在多個系統上運行良好,儘管每個系統都有一些要克服的怪癖。我沒有詳細說明。如果有人提供更好的解決方案,我會轉換首選答案。 – hepcat72

1

爲了說明起見,我們稱之爲外部依賴關係foobar

根據@CentralCalmAndCarryOn的評論,首先考慮是否可以用CPAN(可能是Foo::Bar)或幾行Perl代替foobar

否則,最好的行動當然是:

  1. 創建一個名爲Alien::Foobar新CPAN分佈。 Alien::Foobar的工作是下載,或許編譯,然後安裝foobar,作爲Alien::Foobar的Makefile.PL或Build.PL的一部分。

    (存在一個名爲Alien::Base其目的是使做這樣的比較容易的事情模塊,它主要是針對安裝庫而不是二進制文件,雖然我已經在使用它後取得了一些成功。)

  2. 現在您最初的Makefile.PL可以聲明對Alien::Foobar的依賴關係。
+0

那麼是否沒有傳統的方式來處理第三方命令行可執行依賴關係?我剛寫完一個處理依賴項安裝的shell安裝腳本。實質上,它只是一個curl,tar,chmod,cp,& ln;,但我需要擔心他們想要安裝的位置,是否以root身份安裝,這些命令是否存在,是否附加到用戶環境腳本等。是我第一次嘗試這樣的劇本。有沒有更簡單的方法來做到這一點? – hepcat72