簡體   English   中英

使用 setup.py 從 git at tag 安裝 python 包

[英]Installing python package from git at tag with setup.py

我在私有 git 倉庫中有一個包 (foo)。 我想通過 bar 的 setup.py 安裝 foo 以供另一個包 bar 使用。 我想要一個特定的版本 - setup.py 中 foo 的版本匹配它的 git 標簽(0.3.2,git 標簽是 v0.3.2)

bar 的 setup.py 如下所示:

#!/usr/bin/env python
  
from setuptools import setup, find_packages

setup(name='bar',
        install_requires=['foo@ git+ssh://git@github.com/fergusmac/foo.git@v0.3.2#subdirectory=somedir']
    )

我還嘗試在最后明確添加版本:

install_requires=['foo@ git+ssh://git@github.com/fergusmac/foo.git@v0.3.2#subdirectory=somedir==0.3.2']

我目前在我的 venv 中安裝了 0.3.1 版。 當我嘗試通過pip install .安裝這個 setup.py 時pip install . , 或pip install . -U pip install . -U版本沒有升級 - repo 甚至沒有簽出:

Requirement already satisfied, skipping upgrade: foo@ git+ssh://git@github.com/fergusmac/foo.git@v0.3.2#subdirectory=src==0.3.2 from 
git+ssh://****@github.com/fergusmac/foo.git@v0.3.2#subdirectory=src==0.3.2 in 
./venv/lib/python3.8/site-packages (from bar==0.0.0) (0.3.1)

但是,當我直接使用pip安裝foo時,升級就完成了:

pip install git+ssh://git@github.com/fergusmac/foo.git@v0.3.2#subdirectory=src

Collecting git+ssh://****@github.com/fergusmac/foo.git@v0.3.2#subdirectory=src
  Cloning ssh://****@github.com/fergusmac/foo.git (to revision v0.3.2) to /tmp/pip-req-build-gxj2duq6
  Running command git clone -q 'ssh://****@github.com/fergusmac/foo.git' /tmp/pip-req-build-gxj2duq6
  Running command git checkout -q 40fa65eb75fc26541c90ee9e489ae6dd5538db1f
  Running command git submodule update --init --recursive -q
...
Installing collected packages: foo
  Attempting uninstall: foo
    Found existing installation: foo0.3.1
    Uninstalling foo-0.3.1:
      Successfully uninstalled foo-0.3.1
    Running setup.py install for foo... done
Successfully installed foo-0.3.2

我不明白為什么用 setup.py 安裝會產生不同的行為。 我如何確保它檢查回購並尋找正確的版本?

后續問題 - 我將如何指定“檢查 foo 的主分支並安裝任何版本,如果它高於當前安裝的版本”?

你問的是一個准確而有效的問題,但我不相信會出現令人滿意的答案。 我不確定為什么您所做的不起作用,但是使用 pip 和 setuptools 的直接 URL 依賴項是一個新的且相當復雜的功能,並且在 setuptools 方面可能存在錯誤/缺乏。

我假設您想要做的是將包foo作為bar的依賴項 - 您實際上不需要使用PEP 508直接 URL 說明符格式。 相反,您可以提供帶有(相對)路徑作為依賴項說明符的pipsetuptools ,然后使用 Git 子模塊來填充這些路徑。 例如:

git submodule add git@github.com/fergusmac/foo.git
pip install ./foo

這將安裝您添加子模塊時檢出的 foo 的任何版本。 正如這個答案所解釋的,您可以更改子模塊的檢出版本,然后像這樣安裝它:

cd foo
git checkout v0.3.2
cd ..
pip install ./foo

對於 setuptools,您可以像這樣指定它:

from pathlib import Path

...

setup(
    name='bar',
    install_requires=[
        f'foo @ file://localhost/{Path(__file__).parent}/foo/',
    ],
)

Path(__file__).parent是包含 bar 的setup.py文件的目錄。 該位/foo/的路徑(例如/foo/在這種情況下)應該是 foo 的子模塊相對於包含 bar 的setup.py文件的目錄的位置。


后續問題 - 我將如何指定“檢查 foo 的主分支並安裝任何版本,如果它高於當前安裝的版本”?

在子模塊中簽出master ,然后通過pip install --upgrade . (假設.是 bar 的項目目錄)。


另見: https : //softwareengineering.stackexchange.com/a/365583/271937

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM