我在私有git repo中有一个包(foo(。我想通过bar的setup.py安装foo供另一个包bar使用。我想要一个特定的版本-setup.py中foo的版本控制与它的git标记匹配(0.3.2,git标记为v0.3.2(
酒吧的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时,版本没有升级——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
的依赖项——实际上您不需要使用PEP508直接URL说明符格式。相反,您可以为pip
或setuptools
提供(相对(路径作为依赖项说明符,然后使用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
是包含酒吧的setup.py
文件的目录。该位之后的路径(例如,本例中的/foo/
(应该是foo的子模块相对于包含bar的setup.py
文件的目录的位置。
后续问题-我如何指定"检查foo的主分支,如果它高于当前安装的版本,则安装任何版本"?
在子模块中签出master
,然后通过pip install --upgrade .
安装(假设.
是bar的项目目录(。
另请参阅:https://softwareengineering.stackexchange.com/a/365583/271937