2013-08-07 36 views
12

我有幾個python應用程序包含應該打包並部署爲RPM的腳本/模塊。使用RPM分發python軟件包以及模塊依賴項

更棘手的一點是,每個應用程序應該與所有的python模塊依賴關係一起分發,並且應該優先使用這些應用程序,而不是系統範圍內安裝的任何應用程序。

其中一些RPM的目標主機的網絡訪問受限,因此RPM應包含運行該應用程序所需的所有內容,而不是在部署時下載任何內容。

我看過包裝和發行virtualenv,但重新部署virtualenv似乎沒有得到很好的支持。我看過zc.buildout,但發現文檔缺乏。我可以看到如何在開發過程中下載依賴項,但不知道如何將它們作爲更大應用程序的一部分進行分發。有可能不同的應用程序需要相同模塊的不同版本,所以這些應用程序不應該安裝在系統範圍內。

另一個痛點是應用程序中的任何python腳本需要修改,以便在開發期間和部署後使用不同的sys.path,但我無法看到明顯的解決方法。

有關如何最好地實現這一點的建議?從一個開發者的角度對工作流程的理想總結會是什麼樣子:

  1. 下載應用程序源
  2. 運行腳本,如果不存在(可能使用pip
  3. 運行腳本來構建以獲取特定模塊依賴Python應用程序,並將其打包,所有下載的依賴到RPM

然後最終RPM應安裝並運行的,沒有網絡訪問的主機上,並且只有一個Python解釋器安裝。

+1

你可能會分發一個獨立的python可執行文件 - 打包成RPM?你需要使用你的源代碼嗎?如果不看這裏http://stackoverflow.com/questions/5458048/how-to-make-a-python-script-standalone-executable-to-run-without-any-dependency – Anshul

+1

我沒有使用它,但[conda's](http://www.continuum.io/blog/conda)旨在處理像你這樣的病例。在此鏈接查看「滾動您自己的軟件包」部分。 –

+0

您應該使用pip捆綁包或pip「wheel houses」 – ionelmc

回答

1

我認爲這是兩個獨立的問題。

  1. 您希望爲您的開發人員提供可重複的安裝/構建系統。

  2. 您需要一個安裝程序生成器。

構建(或點,也許與一個額外的腳本相結合)可以照顧第一個問題。基本上是:「如何讓這個項目在新的筆記本電腦上開發」。理想情況下,您只需說python bootstrap.py;bin/buildout並準備就緒(與pip/virtualenv相同)。

既然你有一個可重複的構建,你可以使用它作爲安裝程序的基礎。 Handiest是一個乾淨的虛擬機,您僅用於此目的。例如Virtualbox/vagrant。製作設置virtualbox的腳本並在其中安裝適當的依賴關係。

然後,安裝程序構建器腳本可以在virtualbox中完成您的項目的全新檢出,並在要安裝的位置(例如/opt/yourproject)中執行可重複構建。

然後使用FPM來製作實際的包(.deb,.rpm,無論)。傳入FPM選項,告訴它必要的依賴關係,這樣您就可以確保安裝這些依賴關係。 (注意:這些是像memcached或postgres這樣的操作系統級依賴項; python依賴項應該由pip或buildout來處理)。

如果你在這兩個較小的問題上分裂你的大問題,兩者都可以分別進行攻擊。

+1

FPM的一個問題是,不同的包(您要安裝的)可能具有不同的依賴關係(例如,一個包需要請求1.6和另一個請求2.1等),而您無法表達這些差異,因爲FPM會將一個Python包打包爲RPM並進行安裝(可以這麼說)。因此,最好將一個python項目及其依賴項安裝爲一個RPM,如[rpmvenv](https://github.com/kevinconway/rpmvenv)。 – miku

相關問題