如何`pip install`一个包含Git依赖的包?

Pie*_*ter 19 python git pip

我有一个名为some-library (实际名称已被更改)的私有库,其安装文件看起来有点像这样:

setup(
    name='some-library',

    // Omitted some less important stuff here...

    install_requires=[
        'some-git-dependency',
        'another-git-dependency',
    ],
    dependency_links=[
        'git+ssh://git@github.com/my-organization/some-git-dependency.git#egg=some-git-dependency',
        'git+ssh://git@github.com/my-organization/another-git-dependency.git#egg=another-git-dependency',
    ],
)
Run Code Online (Sandbox Code Playgroud)

所有这些Git依赖项都可能是私有的,因此不能通过HTTP进行安装.我可以使用python setup.py installpython setup.py developsome-library根目录中没有问题.

但是,通过Git安装不起作用:

pip install -vvv -e 'git+ssh://git@github.com/my-organization/some-library.git@1.4.4#egg=some-library'
Run Code Online (Sandbox Code Playgroud)

该命令在查找时失败some-git-dependency,错误地认为它需要从PyPI获取依赖关系,然后在结束它不在PyPI上后失败.我的第一个猜测是尝试重新运行命令--process-dependency-links,但后来发生了这种情况:

   Cannot look at git URL git+ssh://git@github.com/my-organization/some-git-dependency.git#egg=some-git-dependency
   Could not find a version that satisfies the requirement some-git-dependency (from some-library) (from versions: )
Run Code Online (Sandbox Code Playgroud)

为什么会产生这个模糊的错误?pip install具有Git依赖关系的包可能是私有的正确方法是什么?

mir*_*ixx 6

使用可能是私有的Git依赖项来安装包的正确方法是什么?

两种选择

  1. dependency_links像你一样使用.请参阅下文了解详情.

  2. dependency_links在setup.py的旁边,使用一个特殊的dependency-links.txt,收集所有必需的包.然后在requirements.txt中添加此包.这是我的推荐选项,如下所述.

    # dependency-links.txt
    git+ssh://...@tag#egg=package-name1
    git+ssh://...@tag#egg=package-name2
    # requirements.txt (per deployed application)
    -r dependency-links.txt
    
    Run Code Online (Sandbox Code Playgroud)

虽然选项2在包管理上增加了一些额外的负担,即保持dependency-links.txt是最新的,但它使得安装包更加容易,因为你可以"忘记添加--process-dependency-link选项" pip install.

也许更重要的是,使用dependency-links.txt可以指定要在部署中安装的确切版本,这在CI/CD环境中是您想要的 - 没有什么比安装某个版本更危险.从软件包维护者的角度来看,指定最小版本是很常见的并且被认为是良好的做法,例如

    # setup.py in a package
    ...
       install_requires = [ 'foo>1.0', ... ]
Run Code Online (Sandbox Code Playgroud)

这很好,因为它使您的包与其他具有相似依赖关系但可能在不同版本上的包很好地协同工作.但是,在部署的应用程序中,如果包之间存在冲突的要求,这仍然可能导致混乱.例如,包A可以foo>1.0,包B想要foo<=1.5,最新版本是foo==2.0.使用dependency-links.txt可以是特定的,为所有包应用一个版本:

    # dependency-links.txt
    foo==1.5
Run Code Online (Sandbox Code Playgroud)

该命令在寻找某些git依赖时失败,

要使其工作,您需要为pip 添加--process-dependency-links以识别对github的依赖关系,例如

pip install --process-dependency-links -r private-requirements.txt
Run Code Online (Sandbox Code Playgroud)

请注意,从pip 8.1.0开始,您可以将此选项添加到requirements.txt.在缺点方面,它将应用于所有已安装的软件包,并可能产生意想不到的后果.也就是说,我发现使用dependency-links.txt是一种更安全,更易于管理的解决方案.

所有这些Git依赖项都可能是私有的

有三种选择:

  1. 在每个必需的软件包存储库上添加协作者.这些协作者需要使用github设置他们的ssh密钥才能使用.然后用git+ssh://...

  2. 向每个存储库添加部署密钥.这里的缺点是您需要将相应的私钥分发给需要部署的所有计算机.再次使用git+ssh://...

  3. 在包含私有存储库的github帐户上添加个人访问令牌.然后你可以使用git+https://accesstoken@github.com/...缺点是访问令牌将对相应的github帐户上的所有存储库(公共和私有)具有读写访问权限.从好的方面来说,不再需要分发和管理每个存储库的私钥,循环密钥要简单得多.在一个内部环境中,每个开发人员都可以访问所有存储库,我发现这是每个人最有效,最轻松的方式.因人而异