【问题标题】:Python setuptools: How can I list a private repository under install_requires?Python setuptools:如何在 install_requires 下列出私有存储库?
【发布时间】:2013-08-04 07:40:06
【问题描述】:

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

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,因为后者不支持this 答案中的install_requiresdependency_links 参数。

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

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

  1. dependency_links 中使用git+ssh:// 而不是https://,就像使用pip 安装repo 一样。这失败了,因为 setuptools 无法识别此协议(“未知 url 类型: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。不管怎样,没有骰子。

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

没有答案的重复问题here

【问题讨论】:

    标签: python github setuptools


    【解决方案1】:

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

    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 的链接中。

    【讨论】:

    【解决方案2】:

    这对我有用:

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

    【讨论】:

    • 您好 vadimg - 您使用的是哪个版本的 setuptools/distribute?我使用分发 0.7.3(最新版本)得到“未知 url 类型:git+ssh”。
    • 三年后这对我不起作用...得到:找不到满足要求的版本
    • 截至 2016 年 10 月 28 日,这种方法似乎已失效
    • 使用现代 pip,您需要包含一个选项,例如 pip install --process-dependency-links ...
    • --process-dpendency-links 已弃用,使用 PEP508 url 规范查看我的答案
    【解决方案3】:

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

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

    【讨论】:

    • 如何找到eggname-version
    【解决方案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
    • 这是我让它工作的唯一方法,尽管我选择了import pip。 @vadimg 的回答或 this suggestion in pypa/pip 都不起作用。
    • 这将安装一个依赖,即使运行与安装无关的东西,如python setup.py --version
    【解决方案5】:

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

    【讨论】:

    • 我收到一条找不到标签或分支消息。尽管我试图克隆的私人仓库确实有一个标签。
    • 找出问题所在。该标签在 github 中前面有一个 v。所以我需要在 setup.py 脚本中使用v1.1.0 而不是1.1.0
    【解决方案6】:

    这适用于我们的场景:

    1. 包在 github 的私有仓库中
    2. 我们希望将其安装到站点包中(而不是使用 -e 安装到 ./src)
    3. 能够使用 pip install -r requirements.txt
    4. 能够使用 pip install -e reposdir(或来自 github),其中依赖项仅在 requirements.txt 中指定

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

    【讨论】:

      【解决方案7】:

      我试图让它与 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

      【讨论】:

      • 如果您使用ssh:// 并遇到Could not resolve hostname,请将克隆网址中的: 更改为/。我在 gitlab 上遇到了这个错误。
      • 这似乎不再起作用,因为 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')
      • 强调 不同,如果是公共 repo,您​​可以将 'ssh://git@' 替换为 'https://'
      • @Anusha 抱歉,我无法重现 cglacet 的错误。他/她的存储库不是私有的,我希望 Phil 的建议能够解决它。你试过菲尔的建议吗?
      • @TomHemmes 我正在尝试安装本地软件包,所以在install_requires 我有&lt;package-name&gt; @ file://localhost/lib/&lt;package-name&gt;/&lt;package_name&gt;.version.whl 并且我得到与@cglacet 相同的错误
      【解决方案8】:

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

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

      【讨论】:

        【解决方案9】:

        使用 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 中

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-06-01
          • 2021-06-28
          • 2014-03-21
          • 2020-07-20
          • 2014-08-19
          • 2020-10-24
          • 2021-07-11
          相关资源
          最近更新 更多