2010-11-01 28 views
5

我正在做一些python項目,現在我想弄清楚如何使用我自己版本的現有開源軟件包。在我的python項目上使用定製軟件包

例如,我在zc.buildout中使用tipfy,並且在'paypal'包中添加了。不幸的是,它沒有我需要的功能,所以我已經在github上分支並添加了該功能。我會向原始軟件包維護者發送一個請求,但是他們是否接受我的補充,我想使用我的軟件包版本,並保留讓zc.buildout管理我的依賴關係的便利性。我該怎麼做呢?

我是否將自己的圖書上傳到PyPI,並用我的名字作爲前綴?這不會不必要地污染索引?

還是應該製作和維護我自己的索引和包回購?我在哪裏可以找到這個格式?是否違反了OSS許可條款,以使用相同名稱的修改包託管我自己的回購協議? (我寧可不修改項目中的每個文件與新的命名空間)

我敢肯定這個問題出現了很多,而不僅僅是用python。我可以看到Maven和SBT也會發生這種情況......當人們想要使用他們自己版本的流行包時,他們通常會做什麼?

回答

5

有兩種方法可以解決這個問題。我同時使用,這取決於附加件被用於歷境:

  1. 使用mr.developer爲包括從一個版本控制系統封裝(mr.developer支持範圍廣泛的系統,包括GIT)。我在開發時使用這個。

  2. 構建一個私有包存儲庫。 Apache中的簡單目錄列表就足夠了。網址添加到您的私人存儲庫作爲find-links項:

    [buildout] 
    ... 
    find-links = 
        ... 
        http://username:[email protected]/projectname 
    

    在這個例子中我還包括一個用戶名和密碼(再擴建將認證),這是具體的項目在服務器上的路徑。當然,您也可以爲您的所有項目建立一個大的私有存儲庫。

    在該存儲庫中,您可以輸入完整的蛋,也可以只是包的壓縮包。在PyPI之前搜索find-links中指定的存儲庫。

    我使用這種方法進行部署構建。這樣軟件將使用發佈的軟件包,這使得發佈管理更加清晰和簡單。

託管你自己的OSS包的分支是完全沒錯!這是使用OSS時獲得的自由之一。請注意,當您像這樣分配GPL代碼並將其分發給第三方時,您需要對其進行更改。包存儲庫是遵守這一點的一種方式。

+0

謝謝...將與此一起去。我認爲這是一個非常有用的方法來維護多個項目的代價。 – 2010-11-01 14:54:28

+0

在構建配置中使用用戶名和密碼並不好。最好把這些放在.pypirc中:參見https://stackoverflow.com/questions/37323392/how-to-safely-basic-auth-to-private-pypi-with-zc-buildout – Petri 2017-09-30 12:00:28

0

您首先在您的項目的setup.py中放入您在dependency_links中放置的任何路徑。因此,只需將包放入路徑中,並將dependency_links設置爲該路徑即可。

local_packages = ['file:///path/to/packages'] 

setup(
... 
dependency_links=local_packages, 
...) 

Setuptool文檔覆蓋更多關於它是如何工作,但是這真的一切就是那麼一點點。

編輯: zc.buildout默認使用setuptools dependency_links var。 If you want to turn it off

+0

會試試這個..需要在文件夾中是從'sdist'的tar.gz,對吧? – 2010-11-01 07:50:19

+0

擴建提供了更好的選擇來管理這一點。無需使用分發配置來監控您的python包! – 2010-11-01 09:57:10

+0

我認爲buildout只是掩蓋了這個機制而不是複製它。您使用find-links的答案聽起來非常相似。另外,我發現配置配置沒有問題。每個pypi包都有一個。 – dcolish 2010-11-01 14:18:55

2

爲了讓您頭疼,我真的建議您只將所有這些自定義代碼捆綁到您的軟件包中。假設你製作了一些package的叉子。只要它的許可證允許,我只需將修改後的package版本與我的代碼捆綁在一起,就好像它只是另一個目錄一樣。您可以將它放在package的本地,以便輕鬆找到它。一旦package的開發人員修復了您需要的內容,只需刪除此目錄並再次使其成爲對在線軟件包的依賴。

這種方法的另外一個好處是可以更方便地向用戶/客戶分發。

+0

我將在幾個項目中使用'package' ......真的不想維護它的很多副本,尤其是當我可以將它解析爲依賴項時。 – 2010-11-01 13:38:08

1

這已經有一段時間了,因爲我已經使用了buildout,但是如果我正確記得,有一個點子配方允許您使用點子需求文件。您可以創建一個包含如下內容的需求文件:

-e git+http://<github url> 

這將在安裝時在本地檢查包。

+0

這很有趣.. 。會檢查出來。 – 2010-11-01 13:39:34

0

我是否將自己的圖書上傳到PyPI並以我的名字作爲前綴?

那不是不必要的污染指數?

顯然。 (此外,你假設你的擴展實際上是對別人有用,它可能不是所有的有用的人,但你。事實上,你的擴展可能指示故障,瞭解包)。

還是應該我製作和維護自己的索引和包回購?

從來沒有。這完全是愚蠢的。你有修改後的包。除非您要完成PyPI,否則不需要存儲庫。你可以試試,但爲什麼要麻煩?


這就是你要做的。

延伸

可以很容易地擴展一個給定的包,而無需修改或分叉。

my_paypal.py

from paypal import * 

class MyFancyExtension(SomeExistingClass): 
    def override(self, ...) 

def my_other_extension(...): 
    this() 
    that() 

這是很容易。這通常比分叉更好,因爲您保留原始包未被擴展程序修改過。

+0

我可以這樣做,但我想改善圖書館本身並貢獻上游的變化。我也將它用作我的幾個項目的依賴項。基於這一點,最好主辦一個私人回購協議,並在追趕時回到主要回購協議。 – 2010-11-01 13:33:59

+0

請注意,有一個非常好的理由有一個自定義的PyPI服務器(「索引和軟件包回購」)。 – Petri 2017-09-30 11:57:59

0

對於您的私有,私有,分支或開發包,擁有您自己的自定義PyPI服務器非常有意義。

例如pypiserver重量輕,易於設置。

相關問題