2012-07-29 73 views
3

我有套餐A和B,都有自己的git倉庫,的PyPI頁,等...套餐A取決於包B,並通過使用install_requires關鍵字我能得到一個自動下載並安裝B.有沒有辦法將多個軟件包與Python setuptools捆綁在一起?

但是,假設我想進一步爲我的特別不懂用戶的用戶提供幫助;我想實際上將包B包含在包A的tar/zip中,因此不需要下載(這也使得他們可能對包B的setup.cfg進行任何手邊編輯)

是否存在建議(理想自動化)方式,

  • 包括A中的B當我打電話sdist對於A
  • 告訴B是捆綁瞭解決的依賴(有點像本地dependency_links)setuptools的

謝謝!

回答

0

這被稱爲「供應商」,不,這種方法不支持。

這也是一個壞主意;您希望將安裝保留到專門的工具中,這些工具不僅管理依賴關係,而且還安裝了哪些版本。使用buildoutpip's requirements.txt format等工具,您可以非常精確地控制正在使用的版本。

通過在內部捆綁版本的依賴關係,您可以強制用戶使用它的版本,或者使這些工具更難以確保給定安裝的使用版本一致。另外,你可能會浪費帶寬和空間;如果其他軟件包也包含相同的要求,則您現在有多個副本。如果您的依賴關係已更新以解決嚴重的安全問題,則必須重新發布捆綁它的任何軟件包。

過去,一些軟件包確實使用vendorize打包來在其分發中包含依賴項。 requests是一個最好的例子;他們放棄了這種方法,因爲它使發佈過程變得複雜。例如,每次在某個出售的軟件包中出現錯誤時,他們必須生成一個新版本以包含該修復程序。

如果你想堅持包括包,你必須編寫自己的支持。我認爲requests手動只是將供應商的軟件包添加到他們的存儲庫;所以他們保留了不時更新的靜態副本。或者,您可以在創建分發時擴展setup.py以下載代碼。

+0

我同意它有點奇怪,但是如果你放縱我一秒鐘......我想要做的就是爲項目B提供一個「dependency_link」來爲setuptools(或任何其他兼容的構建系統)查找。我恰好想將它放在項目A的''sdist'' tarball中。爲什麼那麼糟糕? – marius 2012-07-29 09:43:38

+0

@marius:爲什麼第二次下載的自動化工具如此糟糕? :-) – 2012-07-29 09:44:47

+0

我想大部分是我把它放在括號中,主要是我期望項目B可能需要對setup.cfg進行一些修改,而對於非Python精明的用戶,我希望項目B的' 'setup.cfg''坐在那裏準備修補,當setuptools試圖解決依賴性時,應該會出錯。 – marius 2012-07-29 09:53:02