基于提交ID的私有GitLab仓库依赖链接的Python setup.py

3

我正在尝试安装一个私有依赖项(这不是 Python 可以在 PyPI 上找到的内容)。

我已经按照这里所述的步骤将以下内容添加到文件 setup.py 中(详情请参见:https://python-packaging.readthedocs.io/en/latest/dependencies.html#packages-not-on-pypi):

dependency_links = [
        'https://gitlab.com/<PRIVATE_ORG>/<PRIVATE_REPO>.git@<COMMIT_ID>'
      ]

在官方文档中,他们并没有详细解释该URL的格式是什么,不过在使用@之后加上<COMMIT_ID听起来很合理(因为其他语言和依赖管理工具也是这样做的)。

当执行命令python setup.py install时,我在日志/输出中看到了以下内容:

Reading https://gitlab.com/<PRIVATE_ORG>/<PRIVATE_REPO>.git@<COMMIT_ID>

但是从其他依赖项的日志/输出中可以看出,我没有看到该软件包被实际安装。
我知道我的git命令有有效的GitLab访问令牌设置,因为我运行了这个命令:
git config \
      --global \
      url."https://<ACCESS_TOKEN_NAME>:<ACCESS_TOKEN_VALUE>@gitlab.com".insteadOf \
      "https://gitlab.com"

我可以通过以下命令检查 git 的配置信息:

git config --list | grep gitlab
url.https://<ACCESS_TOKEN_NAME>:<ACCESS_TOKEN_VALUE>@gitlab.com.insteadof=https://gitlab.com
  • 在运行setup.py时,Python是否使用git命令?
  • 我如何在Python的setup.py文件中指定一个私有的GitLab依赖项?它应该基于提交ID而不是软件包版本
  • 上述内容有什么问题吗?
  • 我还觉得当使用pip install并将其定位到setup.py而不是运行python setup.py install时,它可能会以不同的方式运行,有没有一种独特的方法使这两种Python安装都可以工作?我之所以问这个问题是因为在玩弄dependency_links时,我尝试了各种东西,如git+ssh而不是https和其他变化,所有这些都无法安装那个私有库,各种日志/输出都说找不到该存储库。

编辑

我避免使用dependency_links,因为它似乎已经被弃用,所以我使用了答案中提出的解决方案:

install_requires=[
    ...
    "mylibraryname @ git+https://<ACCESS_TOKEN_NAME>:<ACCESS_TOKEN_VALUE>@gitlab.com/<PRIVATE_ORG>/<PRIVATE_REPO>.git@<COMMIT_ID>",
    ...
],

然而,当执行python setup.py install --record installed_files.txt时,安装过程失败并显示以下消息:

Searching for mylibraryname@ git+https://<ACCESS_TOKEN_NAME>:<ACCESS_TOKEN_VALUE>@gitlab.com/<PRIVATE_ORG>/<PRIVATE_REPO>.git@<COMMIT_ID>
Reading https://pypi.org/simple/mylibraryname/
Couldn't find index page for 'mylibraryname' (maybe misspelled?)
Scanning index of all packages (this may take a while)
Reading https://pypi.org/simple/
No local packages or working download links found for mylibraryname@ git+https://<ACCESS_TOKEN_NAME>:<ACCESS_TOKEN_VALUE>@gitlab.com/<PRIVATE_ORG>/<PRIVATE_REPO>.git@<COMMIT_ID>
error: Could not find suitable distribution for Requirement.parse('mylibraryname@ git+https://<ACCESS_TOKEN_NAME>:<ACCESS_TOKEN_VALUE>@gitlab.com/<PRIVATE_ORG>/<PRIVATE_REPO>.git@<COMMIT_ID>')

我尝试使用 pip install . 命令,并假设当前目录中存在 setup.py 文件,这个方法有效:

Collecting mylibraryname@ git+https://<ACCESS_TOKEN_NAME>:<ACCESS_TOKEN_VALUE>@gitlab.com/<PRIVATE_ORG>/<PRIVATE_REPO>.git@<COMMIT_ID> from git+https://<ACCESS_TOKEN_NAME>:****@gitlab.com/<PRIVATE_ORG>/<PRIVATE_REPO>.git@<COMMIT_ID> (from <MY_LIBRARY_WITH_SETUP_PY>==<MY_LIBRARY_VERSION>)
  Cloning https://<ACCESS_TOKEN_NAME>:****@gitlab.com/<PRIVATE_ORG>/<PRIVATE_REPO>.git (to revision <COMMIT_ID>) to /tmp/pip-install-bakazwe2/mylibraryname
  Running command git clone -q https://<ACCESS_TOKEN_NAME>:sYzRKNsYAnv5GtS6zLZj@gitlab.com/<PRIVATE_ORG>/<PRIVATE_REPO>.git /tmp/pip-install-bakazwe2/mylibraryname

这个解决方案似乎只在包含setup.py的目录中使用pip install .时才有效。但是,这不适用于python setup.py install --record installed_files.txt
2个回答

7

https://python-packaging.readthedocs.io/已经相当陈旧和过时。它的源代码最后更新于2016年12月29日,其中大部分内容自2012年以来没有更新。自那时以来,Python包装领域发生了重大变化。新文档在https://packaging.python.org/上。

dependency_links已被宣布过时,并在pip 19.0中最终删除。它的替代品是install_requires,具有特殊语法(自pip 19.1起支持):

install_requires=[
    'package_name @ git+https://gitlab.com/<PRIVATE_ORG>/<PRIVATE_REPO>.git@<COMMIT_ID>'
]

请参阅https://pip.readthedocs.io/en/stable/reference/pip_install/#requirement-specifiershttps://www.python.org/dev/peps/pep-0440/#direct-references
这需要包括pip install .在内的pip install,而不适用于python setup.py install

1
谢谢,这个方法只在使用 pip install . 时有效。我想接受这个答案,但您能否请提一下 pip install .python setup.py install --record installed_files.txt 之间的区别,以及为什么第二种方法会失败。再次感谢。 - TPPZ
由于某种原因,当我将提交ID更新为新值时,pip会显示“要求已满足”。我必须手动先运行pip uninstall -y package_name以确保pip然后拉取具有预期提交ID的版本。 - TPPZ
如果我想指定主分支的提交记录怎么办? - Luk Aron
@LukAron 请更加具体 —— 您想要指定 master 分支(每次 pip install 使用时不同的提交)还是确切的一个提交(与分支无关)? - phd
@phd 当运行 pip install 时,主分支所指向的提交。 - Luk Aron
显示剩余3条评论

0

我读了很多答案,但只有这一个对我有效(使用 pip 20.2.3Gitlab Pypi 功能):

pip3 install --extra-index-url https://__token__:my_personal_token@gitlab.com/api/v4/projects/347/packages/pypi/simple .

我的 setup.py 看起来像这样:

from setuptools import setup

setup(name='whatever_production_scripts',
      version='0.0.1',
      description='Whatever production scripts',
      url='https://gitlab.com/user/whatever',
      author='Me Myself',
      author_email='user@whatever.com',
      license='All rights reserved',
      scripts=[
          'whatever_production_scripts/production/insomnia.py',
          'whatever_production_scripts/production/rdsmaintenance.py',
          'whatever_production_scripts/production/changeinstancetype.py',
      ],
      packages=[
          'whatever_production_scripts',
          'whatever_production_scripts.production',
      ],
      classifiers=[
          "Development Status :: 3 - Alpha",
          "Intended Audience :: System Administrators",
          "Operating System :: POSIX :: Linux",
          "Topic :: Internet",
          "Topic :: System :: Systems Administration",
          "Programming Language :: Python :: 3 :: Only"
      ],
      install_requires=[
          'privatepackage1>=0.1',
          'publicpackage1>=7',
          'publicpackage2>=2'
      ],
      zip_safe=False)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接