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


83

我正在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参数。

上述设置文件无法访问私有存储库,并显示404错误-这是可以预期的,因为GitHub将404返回给未经授权的私有存储库请求。但是,我不知道如何进行setuptools身份验证。

这是我尝试过的一些方法:

  1. 如果使用git+ssh://来安装仓库,请使用而不是https://in 。这会失败,因为setuptools无法识别此协议(“未知的url类型:git + ssh”),尽管分发文档说可以。同上和。dependency_linkspipgit+httpsgit+http

  2. https://<username>:<password>@github.com/...-仍然获得了404(此方法不工作,curl或者wget在命令行或者-尽管curl -u <username> <repo_url> -O <output_file_name>不工作。)

  3. 将setuptools(0.9.7)和virtualenv(1.10)升级到最新版本。也尝试安装分发,尽管此概述说它已合并回setuptools。无论哪种方式,都没有骰子。

目前,我只是setup.py打印出一条警告,指出必须单独下载私有存储库。这显然不理想。我觉得似乎有些明显的东西我不见了,但是无法想像是什么。:)

重复的问题,这里没有答案。


请接受解决方案。
wieczorek1990 '19

Answers:


63

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

请注意; 这与pip 20.0.2Python 3.7.4

setup(
    name='<package>',
...
    install_requires=[
        '<normal_dependency>',
         # Private repository
        '<dependency_name> @ git+ssh://git@github.com/<user>/<repo_name>@<branch>',
         # Public repository
        '<dependency_name> @ git+https://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


#egg=...现在该部分似乎不必要。
Huahuao Gao

1
谢谢!你是绝对正确的,无论是#eggbranch是可选的(见编辑),它也适用于git+https
Tom Hemmes

1
如果您使用ssh://碰上Could not resolve hostname变化:,以/在克隆网址。我在gitlab中遇到此错误。
delijati

11
这似乎不再起作用,因为setuptools似乎在PyPi上寻找一个依赖名称为Reading https://pypi.org/simple/some-fake-name/,然后为的软件包Couldn't find index page for 'some_fake_name' (maybe misspelled?)。最后,最后显示的错误是error: Could not find suitable distribution for Requirement.parse('some_fake_name@ git+ssh://git@github.com/cglacet/quadtree.git')
cglacet

1
强调<dependency_name>与<repo_name>不同,并且如果它是公共仓库,则可以将'​​ssh:// git @'替换为'https://'
Phil P

41

这对我有用:

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

请注意,您必须在egg名称中输入版本号,否则它将无法找到该软件包。


3
嗨,vadimg-您使用的是哪个版本的setuptools / distribute?我使用分发0.7.3(最新版本)得到“未知的URL类型:git + ssh”。
Eric P

2
3年后,这对我不起作用...得到:找不到满足要求的版本
jsmedmar

7
截至2016年10月28日,此方法似乎已失效
最多

1
对于现代点子,您需要包括一个选项,例如pip install --process-dependency-links ...
Ash Berlin-Taylor

2
--process-dpendency-links已弃用,请使用PEP508网址规范查看我的答案
Tom Hemmes

10

我在此上找不到任何好的文档,但主要是通过反复试验来找到解决方案。此外,从pip和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中
  • 即使PyPI上没有软件包,您也需要在链接末尾包含一些版本号(此处是0)。这必须是实际数字,而不是单词。
  • 您需要以git+序号告诉setuptools它是克隆存储库,而不是指向zip / tarball
  • version 可以是分支,标签或提交哈希
  • --process-dependency-links如果从pip安装,则需要提供

我收到找不到标签或分支消息。尽管我尝试克隆的私人仓库确实有一个标签。
trendetter37

1
找出问题所在。标签v在github中有一个前缀。因此,我需要使用v1.1.0而不是1.1.0在setup.py脚本中使用。
trendetter37'Nov

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'] )

我了解在安装脚本中进行系统调用存在道德问题,但我想不出另一种方法来做到这一点。


是的,由于以下原因,这对我们来说也是一个丑陋的解决方法:github.com/pypa/pip/issues/2822
Tommy

尽管我与一起去了,但这是我可以使它工作的唯一方法import pip。@vadimg的答案或pypa / pip中的此建议均无效
Gens 2016年

4
即使运行与安装无关的内容,这也会安装依赖项python setup.py --version
WhyNotHugo

1

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

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

0

对于公共存储库,使用来自github的存档URL对我有效。例如

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

您如何找到eggname-version
cglacet19年

-1

编辑:这似乎仅适用于公共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依赖项的语法。


我仍然收到相同的404错误。您的案例中的回购协议是私有的吗?我知道#egg =语法,但不知道它会影响身份验证。
Eric P

抱歉,这当然是一个公共回购项目。如果https // <用户名>:<密码> @ ... tarball URL不适用于githubs私有存储库,则可能无法使用当前的setuptools进行此操作,因为此问题似乎也表明:下载时遇到问题-git归档-tar包从-私人回购

您也可以尝试开发版本的setuptools和/或检查代码。相关的代码似乎是:package_index:fetch_distribution():534 package_index.py:_download_url():736

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.