![](/img/trans.png)
[英]How to `pip install` a package that has non-Python dependencies?
[英]How to `pip install` a package that has Git dependencies?
我有一個名為some-library
的私有庫(實際名稱已被更改),其中的安裝文件看起來有點像這樣:
setup(
name='some-library',
// Omitted some less important stuff here...
install_requires=[
'some-git-dependency',
'another-git-dependency',
],
dependency_links=[
'git+ssh://git@github.com/my-organization/some-git-dependency.git#egg=some-git-dependency',
'git+ssh://git@github.com/my-organization/another-git-dependency.git#egg=another-git-dependency',
],
)
所有這些Git依賴項都可能是私有的,因此不能通過HTTP進行安裝 。 我可以在some-library
的根目錄中使用python setup.py install
和python setup.py develop
而不會出現問題。
但是,通過Git安裝不起作用:
pip install -vvv -e 'git+ssh://git@github.com/my-organization/some-library.git@1.4.4#egg=some-library'
當它查找some-git-dependency
,該命令失敗,錯誤地認為它需要從PyPI獲取依賴關系,然后在得出它不在PyPI上之后失敗。 我的第一個猜測是嘗試使用--process-dependency-links
重新運行命令,但后來發生了這種情況:
Cannot look at git URL git+ssh://git@github.com/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: )
為什么會產生這個模糊的錯誤? 使用可能是私有的Git依賴項來pip install
包的正確方法是什么?
使用可能是私有的Git依賴項來安裝包的正確方法是什么?
兩種選擇
像你一樣使用dependency_links
。 請參閱下文了解詳情。
沿着側dependency_links
在setup.py的,使用一種特殊的dependency-links.txt
收集所有需要的軟件包。 然后在requirements.txt中添加此包。 這是我的推薦選項,如下所述。
# dependency-links.txt git+ssh://...@tag#egg=package-name1 git+ssh://...@tag#egg=package-name2 # requirements.txt (per deployed application) -r dependency-links.txt
雖然選項2在包管理上增加了一些額外的負擔,即保持dependency-links.txt是最新的,但它使得安裝包更容易,因為你可以'忘記在pip install
上添加--process-dependency-link
選項。
也許更重要的是,使用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
。 使用dependency-links.txt可以是特定的,為所有包應用一個版本:
# dependency-links.txt
foo==1.5
該命令在尋找某些git依賴時失敗,
要使其工作,您需要為pip添加--process-dependency-links以識別對github的依賴關系,例如
pip install --process-dependency-links -r private-requirements.txt
請注意,從pip 8.1.0開始,您可以將此選項添加到requirements.txt。 在缺點方面,它將應用於所有已安裝的軟件包,並可能產生意想不到的后果。 也就是說,我發現使用dependency-links.txt
是一種更安全,更易於管理的解決方案。
所有這些Git依賴項都可能是私有的
有三種選擇:
在每個必需的軟件包存儲庫上添加協作者。 這些協作者需要使用github設置他們的ssh密鑰才能使用。 然后使用git+ssh://...
向每個存儲庫添加部署密鑰。 這里的缺點是您需要將相應的私鑰分發給需要部署的所有計算機。 再次使用git+ssh://...
在包含私有存儲庫的github帳戶上添加個人訪問令牌。 然后你可以使用git+https://accesstoken@github.com/...
缺點是訪問令牌將對相應的github帳戶上的所有存儲庫(公共和私有)具有讀寫訪問權限。 從好的方面來說,不再需要分發和管理每個存儲庫的私鑰,循環密鑰要簡單得多。 在一個內部環境中,每個開發人員都可以訪問所有存儲庫,我發現這是每個人最有效,最輕松的方式。 因人而異
這應該適用於私有存儲庫:
dependency_links = [
'git+ssh://git@github.com/my-organization/some-git-dependency.git@master#egg=some-git-dependency',
'git+ssh://git@github.com/my-organization/another-git-dependency.git@master#egg=another-git-dependency'
],
如果我引用“ pip install依賴鏈接 ”,你不會引用GitHub repo本身,而是引用與該GitHub repo相關聯的tarball圖像:
dependency_links=[
'git+ssh://git@github.com/my-organization/some-git-dependency/tarball/master/#egg=some-git-dependency',
'git+ssh://git@github.com/my-organization/another-git-dependency/tarball/master/#egg=another-git-dependency',
],
“ some-git-dependency
”是some-git-dependency
的名稱*和版本。
你應該在使用#egg的url時使用git + git,如下所示:
-e git+git@repo.some.la:foo/my-repo.git#egg=my-repo
在沒有#egg的情況下在生產中使用git + ssh,但是你可以指定@version或branch @master
git+ssh://git@repo.some.la/foo/my-repo.git@1.1.6
與app版本一起使用git tagging Git Basics - Tagging
“無法查看git URL git + ssh://git@github.com/my-organization/some-git-dependency.git#egg=some-git-dependency”表示pip
無法從此網址獲取html頁面對於頁面中的直接下載鏈接,即pip
不會將URL識別為vcs checkout,因為可能需要說明符與vcs url中的片段部分之間存在一些差異。
對於VCS簽出,您還應附加
#egg=project-version
以確定應該使用哪個包結帳。請務必使用下划線替換名稱或版本中的任何破折號。
替換-
在包和版本字符串中使用_
。
git+ssh://git@github.com/my-organization/some-git-dependency.git#egg=some_git_dependency
和--allow-all-external
可能很有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.