微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 setup.py 从 git at tag 安装 python 包

如何解决使用 setup.py 从 git at tag 安装 python 包

我在私有 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 .pip install . -U 安装此 setup.py 时,版本未升级 - 甚至未检出存储库:

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 的任何版本。正如 this answer 解释的那样,您可以更改子模块的检出修订版,然后像这样安装:

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 的子模块相对于包含 bar 的 setup.py 文件的目录的位置。


后续问题 - 我将如何指定“检查 foo 的主分支并安装高于当前安装版本的任何版本”?

在子模块中签出 master,然后通过 pip install --upgrade . 安装(假设 . 是 bar 的项目目录)。


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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。