2016-04-11 148 views
18

我有一個私人圖書館稱爲some-library(實際名稱已被更改)有一個安裝文件看有點像這樣:如何`pip安裝`具有Git依賴關係的軟件包?

setup(
    name='some-library', 

    // Omitted some less important stuff here... 

    install_requires=[ 
     'some-git-dependency', 
     'another-git-dependency', 
    ], 
    dependency_links=[ 
     'git+ssh://[email protected]/my-organization/some-git-dependency.git#egg=some-git-dependency', 
     'git+ssh://[email protected]/my-organization/another-git-dependency.git#egg=another-git-dependency', 
    ], 
) 

所有這些混帳依賴可能是私有的,所以installation via HTTP不是選項。我可以在some-library的根目錄下使用python setup.py installpython setup.py develop,沒有問題。

但是,安裝過了Git不起作用:

pip install -vvv -e 'git+ssh://[email protected]/my-organization/[email protected]#egg=some-library' 

在查找some-git-dependency命令失敗,錯誤地假定它需要得到一封來自PyPI的依賴關係,然後總結它不是PyPI上的失敗後。我的第一個猜測是嘗試重新運行與--process-dependency-links的命令,但後來發生這種情況:

Cannot look at git URL git+ssh://[email protected]/my-organization/some-git-dependency.git#egg=some-git-dependency 
    Could not find a version that satisfies the requirement some-git-dependency (from some-library) (from versions:) 

爲什麼生產這種模糊的錯誤? pip install包含Git依賴關係的包可能是私有的正確方法是什麼?

+0

你試過'--process-dependency-links -allow-all-external'。 –

回答

6

pip安裝包可能是私有的Git依賴包的正確方法是什麼?

兩個選項

  1. 使用dependency_links爲你做。詳情請參閱下文。

  2. 在setup.py的dependency_links旁邊,使用一個特殊的dependency-links.txt來收集所有需要的軟件包。然後在requirements.txt中添加這個包。這是我的推薦選項,如下所述。

    # dependency-links.txt 
    git+ssh://[email protected]#egg=package-name1 
    git+ssh://[email protected]#egg=package-name2 
    # requirements.txt (per deployed application) 
    -r dependency-links.txt 
    

雖然選項2增加了對包管理一些額外的負擔,即保持依賴性,links.txt最新的,它使安裝包容易得多,因爲你可以」忘記添加--process-dependency-link選項上pip install

也許更重要的是,使用dependency-links.txt您可以指定要在CI/CD環境中安裝的確切版本 - 沒有什麼比安裝某些版本更具風險。從包維護者的角度來看,但它是常見的和好的做法,指定最小版本,如

# setup.py in a package 
    ... 
     install_requires = [ 'foo>1.0', ... ] 

這是偉大的,因爲它使你的封裝,具有類似依賴性還可能在不同版本的其他包很好地工作。但是,在已部署的應用程序中,如果軟件包之間存在衝突的要求,這仍然可能造成混亂。例如。軟件包A可以使用foo>1.0,軟件包B需要foo<=1.5,最新版本是foo==2.0。使用依賴-links.txt你可以具體,將一個版本對於所有包:

# dependency-links.txt 
    foo==1.5 

在查找一些-混帳依賴命令失敗,

要使其工作,您需要添加--process-dependency-links用於識別對github的依賴關係,例如

pip install --process-dependency-links -r private-requirements.txt 

請注意,因爲pip 8.1.0您可以將此選項添加到requirements.txt。不利的一面是它適用於安裝的所有軟件包,並可能產生意想不到的後果。也就是說,我發現使用dependency-links.txt是一個更安全,更易於管理的解決方案。

所有這些混帳的依賴可能是私人

有三個選項:

  1. 新增協作者在每個所需的軟件包的倉庫裏的。這些協作者需要使用github安裝ssh密鑰才能正常工作。然後使用git+ssh://...

  2. 將部署密鑰添加到每個存儲庫。這裏的缺點是您需要將相應的私鑰分發給所有需要部署的機器。再次使用git+ssh://...

  3. 在持有專用存儲庫的github帳戶中添加個人訪問令牌。然後,您可以使用git+https://[email protected]/...缺點是訪問令牌將對各個github帳戶上的所有存儲庫(公共和私有存儲庫)具有讀取和寫入權限。不再需要分發和管理每個存儲庫私鑰,並且循環密鑰要簡單得多。在所有開發人員都可以訪問所有存儲庫的全部環境中,我發現這對每個人來說都是最有效,最輕鬆的方式。 YMMV

+0

感謝您的詳細解釋! – Pieter

+0

是否意味着'pip'不能在沒有requirements.txt的情況下處理'dependency_links'?如果是,是'pip'與'setuptools'不兼容? OP說'easy_install'確實,'pip'沒有。 –

+0

@NizamMohamed你可以'pip install --process-dependency-links whatever-package',它可以正常工作。 pip的主要目的是從官方pypi存儲庫進行安裝,因此默認情況下不會處理依賴關係鏈接。 – miraculixx

1

如果我指的是「pip install dependency links」,你會不會參考GitHub庫本身,而是相關於GitHub庫壓縮包圖片:

dependency_links=[ 
     'git+ssh://[email protected]/my-organization/some-git-dependency/tarball/master/#egg=some-git-dependency', 
     'git+ssh://[email protected]/my-organization/another-git-dependency/tarball/master/#egg=another-git-dependency', 
    ], 

與「some-git-dependency」是name *和版本的依賴關係。

+0

這似乎不適用於SSH,只能使用HTTP(S)。它需要通過SSH工作,因爲回購可能是私有的,我想使用SSH密鑰進行身份驗證。你可以通過SSH提供一個工作示例嗎? – Pieter

3

這應該爲私人倉庫以及工作:

dependency_links = [ 
    'git+ssh://[email protected]/my-organization/[email protected]#egg=some-git-dependency', 
    'git+ssh://[email protected]/my-organization/[email protected]#egg=another-git-dependency' 
], 
+0

明確添加'@ master'對我來說並沒有什麼用。看着詳細的日誌,現在甚至沒有提到Git倉庫。只有這樣:'收集某些git依賴項(來自某個庫) 1個位置來搜索some-git-dependency版本: * https://pypi.python.org/simple/some-git -dependency /' 我在點8.1.1和setuptools 20.10.1。 – Pieter

0

「不能看混帳混帳URL + SSH://[email protected]/my-organization/some-git-dependency.git#egg=some-git-dependency」意味着pip不能取的html頁面來查找頁面中的直接下載鏈接,即,pip無法將URL識別爲vcs checkout,因爲可能需要說明符與vcs url中的片段部分之間存在差異。

對於VCS結賬,您還應該追加#egg=project-version以確定應該使用哪種結算包。

請務必使用下劃線替換名稱或版本中的任何破折號。

檢查Dependencies that aren’t in PyPI

與包和版本字符串一個_更換-

git+ssh://[email protected]/my-organization/some-git-dependency.git#egg=some_git_dependency 

--allow-all-external可能是有用的。

相關問題