正在使用 setup.py 标签安装来自 git 的 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 .
或 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 安装会出现不同的行为。我如何确保它检查存储库并查找正确的版本?
跟进问题 - 我将如何指定 'check master branch for foo and install whatever version is there if it is higher than the current installed version'?
你问的是一个准确而有效的问题,但我不确定会得到一个令人满意的答案。我不确定为什么您正在做的事情不起作用,但是使用 pip 和 setuptools 的直接 URL 依赖项是一个新的且相当复杂的功能,并且可能 buggy/lacking 在 setuptools 方面。
我假设你想要做的是将包 foo
作为 bar
的依赖项 - 你实际上不需要使用 PEP 508 直接 URL 说明符格式。相反,您可以提供 pip
或 setuptools
以及(相对)路径作为依赖说明符,然后使用 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
对于设置工具,您可以这样指定:
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
文件的目录的位置。
Follow up question - how would I specify 'check master branch for foo and install whatever version is there if it is higher than the current installed version'?
在子模块中签出master
,然后通过pip install --upgrade .
安装(假设.
是bar的项目目录)。
另请参阅:https://softwareengineering.stackexchange.com/a/365583/271937
我在私人 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 安装会出现不同的行为。我如何确保它检查存储库并查找正确的版本?
跟进问题 - 我将如何指定 'check master branch for foo and install whatever version is there if it is higher than the current installed version'?
你问的是一个准确而有效的问题,但我不确定会得到一个令人满意的答案。我不确定为什么您正在做的事情不起作用,但是使用 pip 和 setuptools 的直接 URL 依赖项是一个新的且相当复杂的功能,并且可能 buggy/lacking 在 setuptools 方面。
我假设你想要做的是将包 foo
作为 bar
的依赖项 - 你实际上不需要使用 PEP 508 直接 URL 说明符格式。相反,您可以提供 pip
或 setuptools
以及(相对)路径作为依赖说明符,然后使用 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
对于设置工具,您可以这样指定:
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
文件的目录的位置。
Follow up question - how would I specify 'check master branch for foo and install whatever version is there if it is higher than the current installed version'?
在子模块中签出master
,然后通过pip install --upgrade .
安装(假设.
是bar的项目目录)。
另请参阅:https://softwareengineering.stackexchange.com/a/365583/271937