2017-07-26 128 views
1

我需要創建一個虛擬RPM,它似乎在站點包中安裝了一些Python模塊來解決RPM依賴性問題。如何創建假裝提供Python模塊的假RPM?

真實模塊將在Python虛擬環境中使用PIP進行安裝,但爲了使系統工作,導入的模塊需要在全局站點包中提供,因此需要僞裝。

進口如下所示(舉例):from pear.apple.peach import Fruit

當對具有這些進口它依存產生失敗包的RPM構建,所以我需要在本地回購的RPM假裝提供這些所以依賴生成通過。

回答

0

我能夠通過將每個導入複製爲空文件並在每個文件夾級別使用空文件來解決此問題。

例如,爲了解決from pear.apple.peach import Fruit,我會需要安裝以下文件樹中的站點包:

-> pear 
    -> __init__.py 
    -> apple 
    -> peach.py 

規範文件的相關線路的虛擬轉速:

... 
source:FruitDummy.tar.gz  
... 
% install 
mkdir -p $RPM_BUILD_ROOT%{python_sitelib}/pear/apple/ 

install __init__.py $RPM_BUILD_ROOT%{python_sitelib}/pear/ 
install peach.py $RPM_BUILD_ROOT%{python_sitelib}/pear/apple/ 
... 
%files 
%defattr(-,root,root,-) 
%{python_sitelib}/pear/__init__.py* 
%{python_sitelib}/pear/apple/peach.py* 
... 

__init__.pypeach.py被存儲在用於構建RPM的FruitDummy.tar.gz中。

1

你在這個問題中提出的方法對我來說沒有多大意義,要麼使用其他系統rpm軟件包(您打算創建或安裝的軟件包)所需的python模塊創建rpm軟件包,要麼只使用虛擬env,那麼只要你安裝了特定版本的python,你就不需要關心你在系統站點包裏有什麼。雖然可以使系統站點程序包在特定的虛擬env中可見(例如,如果在依賴項中有lxml模塊,則可以從rpm包安裝它,然後使虛擬env可以訪問系統站點程序包,以便您不需要需要在virtualenv中再次安裝它),在虛擬rpm包中提供的特定模塊會破壞它,所以這也沒有意義。

換句話說,在虛擬環境中安裝了某些東西,然後希望通過rpm包安裝系統python模塊來依賴於該虛擬環境的某些內容不會起作用(imho)。

因此,我建議做一:

  • 建立你需要安裝其他軟件包工作模塊的rpm包。只要你對rpmbuild有一些經驗,它不應該那麼辛苦,你可以使用pyp2rpm工具創建初始spec文件,你需要稍微調整一下。但是這也取決於你需要構建多少包,以及你打算如何更新它們(因爲這意味着更新specfile和重建)。
  • 僅使用虛擬env,可以訪問系統站點軟件包或不使用。這樣,您就可以將依賴關係和應用程序安裝到虛擬環境中,並且根本不需要處理rpm包(只要您從rpm包安裝python和virtualenv)。

哪種方式更有意義在你的情況下在很大程度上取決於你有什麼做的(你怎麼打算維持Python模塊,在你打算多少臺機器安裝它,如果你打算自己安裝或者提供給其他人自行安裝,等等......)。

+0

我正在構建系統中自動生成所有Python文件的依賴關係,如果依賴項無法通過項目中的(1)其他源包或(2)從本地預構建RPM緩存。我的問題所依據的約束條件並不常見,但它是我所面對的。 –