Python setuptools:如何在install_requires下列出私有存储库?

时间:2013-08-02 22:22:41

标签: python github setuptools

我正在为项目创建一个setup.py文件,该文件依赖于私有GitHub存储库。该文件的相关部分如下所示:

from setuptools import setup
setup(name='my_project',
    ...,
    install_requires=[
        'public_package',
        'other_public_package',
        'private_repo_1',
        'private_repo_2',
    ],
    dependency_links=[
        'https://github.com/my_account/private_repo_1/master/tarball/',
        'https://github.com/my_account/private_repo_2/master/tarball/',
    ],
    ...,
)

我使用setuptools代替distutils,因为后者不支持install_requiresdependency_links每个this答案的参数。

上面的安装文件无法访问带有404错误的私有存储库 - 这是预期的,因为GitHub会将404返回到未经授权的私有存储库请求。但是,我无法弄清楚如何进行setuptools身份验证。

以下是我尝试过的一些事情:

  1. git+ssh://中使用https://代替dependency_links,就像使用pip安装回购时一样。这失败是因为setuptools无法识别此协议(“未知网址类型:git + ssh”),尽管distribute documentation表示应该这样做。同上git+httpsgit+http

  2. https://<username>:<password>@github.com/... - 仍然获得404.(此方法不能与命令行中的curlwget一起使用 - 尽管curl -u <username> <repo_url> -O <output_file_name>可以正常工作。)

  3. 将setuptools(0.9.7)和virtualenv(1.10)升级到最新版本。虽然this overview表示它已合并回setuptools,但还尝试安装分发版。无论哪种方式,都没有骰子。

  4. 目前我只有setup.py打印出一个警告,即必须单独下载私人存储库。这显然不太理想。我觉得有一些显而易见的东西让我失踪,但却想不到它会是什么。 :)

    没有答案here的重复问题。

9 个答案:

答案 0 :(得分:39)

这对我有用:

  install_requires=[
      'private_package_name==1.1',
  ],
  dependency_links=[
      'git+ssh://git@github.com/username/private_repo.git#egg=private_package_name-1.1',
  ]

请注意,您必须在蛋名中包含版本号,否则会说它找不到包。

答案 1 :(得分:23)

我试图通过pip进行安装,但以上内容对我而言不起作用。从[1]我理解应该使用PEP508标准,从[2]我检索到一个确实有效的示例(至少对我而言)。

请注意;这是pip 18.1上的Python3.6

setup(
    name='<package>',
...
    install_requires=[
        '<normal_dependency>',
        '<dependency_name> @ git+ssh://git@github.com/<user>/<repo_name>@<branch>',
    ],
)

以这种方式指定我的软件包后,安装可以正常进行(也可以使用-e设置,而无需指定--process-dependency-links)。

参考 [1] https://github.com/pypa/pip/issues/4187 [2] https://github.com/pypa/pip/issues/5566

答案 2 :(得分:8)

我找不到任何关于此的好文档,但主要是通过试用和解决方案来找到解决方案。错误。此外,从pip&amp; amp; setuptools有一些微妙的差异;但这种方式应该适用于两者。

GitHub没有(目前,截至2016年8月)提供了一种简单的方法来获取私人回购的zip / tarball。所以你需要指向setuptools告诉setuptools你指向一个git repo:

from setuptools import setup
import os
# get deploy key from https://help.github.com/articles/git-automation-with-oauth-tokens/
github_token = os.environ['GITHUB_TOKEN']

setup(
    # ...
    install_requires='package',
    dependency_links = [
    'git+https://{github_token}@github.com/user/{package}.git/@{version}#egg={package}-0'
        .format(github_token=github_token, package=package, version=master)
        ] 

这里有几点说明:

  • 对于私人回购,您需要使用GitHub进行身份验证;我找到的最简单的方法是创建一个oauth令牌,将其放入您的环境中,然后将其包含在URL中
  • 您需要在链接末尾包含某些版本号(此处为0),即使PyPI上没有包也是如此。这必须是一个实际的数字,而不是一个字。
  • 您需要在git+前面告诉setuptools克隆回购,而不是指向zip / tarball
  • version可以是分支,标记或提交哈希
  • 如果从pip
  • 安装,则需要提供--process-dependency-links

答案 3 :(得分:4)

我找到了一个(hacky)解决方法:

#!/usr/bin/env python

from setuptools import setup
import os

os.system('pip install git+https://github-private.corp.com/user/repo.git@master')

setup( name='original-name'
     , ...
     , install_requires=['repo'] )

我理解在设置脚本中进行系统调用存在道德问题,但我想不出另一种方法可以做到这一点。

答案 4 :(得分:2)

使用来自github的存档URL对我来说适用于公共存储库。 E.g。

dependency_links = [
  'https://github.com/username/reponame/archive/master.zip#egg=eggname-version',
]

答案 5 :(得分:0)

编辑:这似乎只适用于公共github存储库,请参阅注释。

dependency_links=[
    'https://github.com/my_account/private_repo_1/tarball/master#egg=private_repo_1',
    'https://github.com/my_account/private_repo_2/tarball/master#egg=private_repo_2',
],

上面的语法似乎对setuptools 1.0有用。目前,至少将“#egg = project_name-version”添加到VCS依赖关系的语法记录在您提供给distribute documentation的链接中。

答案 6 :(得分:0)

通过汤姆·海姆斯(Tom Hemmes)的回答,我发现这是唯一对我有用的东西:

    install_requires=[
        '<package> @ https://github.com/<username>/<package>/archive/<branch_name>.zip']

答案 7 :(得分:0)

使用 pip 20.1.1,这对我有用

install_requires=[ "packson3@https://tracinsy.ewi.tudelft.nl/pubtrac/Utilities/export/138/packson3/dist/packson3-1.0.0.tar.gz"],

在 setup.py

答案 8 :(得分:-1)

我们的方案的这项工作:

  1. 包在私人仓库中的github上
  2. 我们希望将它安装到site-packages中(而不是带-e的./src)
  3. 能够使用pip install -r requirements.txt
  4. 能够使用pip install -e reposdir(或来自github),其中依赖项仅在requirements.txt中指定
  5. https://github.com/pypa/pip/issues/3610#issuecomment-356687173