97

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

上述设置文件无法访问私有存储库并出现 404 错误 - 这是意料之中的,因为 GitHub 会向未经授权的私有存储库请求返回 404。但是,我不知道如何进行setuptools身份验证。

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

  1. 如果使用. git+ssh://_ _ 这失败了,因为 setuptools 无法识别此协议(“未知 url 类型:git+ssh”),尽管分发文档说它应该。同上和。https://dependency_linkspipgit+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) 升级到最新版本。尽管此概述说它已合并回 setuptools,但也尝试安装分发。无论哪种方式,没有骰子。

目前我只是setup.py打印出一个警告,私人回购必须单独下载。这显然不太理想。我觉得我错过了一些明显的东西,但想不出它可能是什么。:)

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

4

9 回答 9

95

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

请注意; 这是pip 20.0.2开着Python 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

于 2018-12-10T12:56:03.337 回答
45

这对我有用:

  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名称中必须要有版本号,否则会说找不到包。

于 2013-11-27T05:47:32.027 回答
11

我找不到任何好的文档,但主要通过反复试验找到了解决方案。此外,从 pip 和 setuptools 安装有一些细微的差别;但这种方式应该适用于两者。

GitHub 不(目前,截至 2016 年 8 月)不提供获取私有 repos 的 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 它是克隆 repo,而不是指向 zip / tarball
  • version可以是分支、标签或提交哈希
  • --process-dependency-links如果从 pip 安装,您需要提供
于 2016-08-31T16:26:22.770 回答
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'] )

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

于 2015-03-31T19:06:26.953 回答
3

通过 Tom Hemmes 的回答,我发现这是唯一对我有用的东西:

    install_requires=[
        '<package> @ https://github.com/<username>/<package>/archive/<branch_name>.zip']
于 2019-07-04T08:38:45.237 回答
0

使用来自 github 的存档 URL 对我来说适用于公共存储库。例如

dependency_links = [
  'https://github.com/username/reponame/archive/master.zip#egg=eggname-version',
]
于 2014-04-14T13:34:24.630 回答
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

于 2021-04-21T19:47:48.560 回答
-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 依赖项的语法记录在您提供的分发文档的链接中。

于 2013-09-01T23:30:33.137 回答
-2

This work for our scenario:

  1. package is on github in a private repo
  2. we want to install it into site-packages (not into ./src with -e)
  3. being able to use pip install -r requirements.txt
  4. being able to use pip install -e reposdir (or from github), where the dependencies are only specified in requirements.txt

https://github.com/pypa/pip/issues/3610#issuecomment-356687173

于 2018-01-10T18:10:08.450 回答