如何编写setup.py以包含git repo作为依赖项

时间:2015-09-21 06:30:07

标签: python django git packaging setuptools

我正在尝试为我的软件包编写setup.py。我的包需要指定对另一个git仓库的依赖。

这是我到目前为止所做的:

from setuptools import setup, find_packages

setup(
    name='abc',
    packages=find_packages(),
    url='https://github.abc.com/abc/myabc',
    description='This is a description for abc',
    long_description=open('README.md').read(),
    install_requires=[
        "requests==2.7.0",
        "SomePrivateLib>=0.1.0",
        ],
    dependency_links = [
     "git+git://github.abc.com/abc/SomePrivateLib.git#egg=SomePrivateLib",
    ],
    include_package_data=True,
)

当我跑步时:

pip install -e https://github.abc.com/abc/myabc.git#egg=analyse

我得到了

无法找到满足要求的版本SomePrivateLib> = 0.1.0(来自分析)(来自版本:) 找不到SomePrivateLib> = 0.1.0的匹配分布(来自分析)

我做错了什么?

6 个答案:

答案 0 :(得分:34)

您可以找到正确的方法here

dependency_links=['http://github.com/user/repo/tarball/master#egg=package-1.0']

关键是不要提供指向git存储库的链接,而是提供指向tarball的链接。如果您附加/tarball/master,Github会为您创建一个主分支的tarball。

答案 1 :(得分:13)

在仔细阅读以上评论中由@muon链接的pip issue 3939PEP-508 specification之后,我发现使用以下指定模式通过setup.py安装私有仓库依赖项是成功的install_requires(不再dependency_links):

install_requires = [
  'some-pkg @ git+ssh://git@github.com/someorgname/pkg-repo-name@v1.1#egg=some-pkg',
]

@v1.1表示在github上创建的release标签,可以用分支,commit或其他类型的标签替换。

答案 2 :(得分:3)

不幸的是,另一个答案不适用于私有存储库,这是最常见的用例之一。我最终确实将它与如下所示的setup.py文件一起使用:

from setuptools import setup, find_packages

setup(
    name = 'MyProject',
    version = '0.1.0',
    url = '',
    description = '',
    packages = find_packages(),
    install_requires = [
        # Github Private Repository - needs entry in `dependency_links`
        'ExampleRepo'
    ],

    dependency_links=[
        # Make sure to include the `#egg` portion so the `install_requires` recognizes the package
        'git+ssh://git@github.com/example_organization/ExampleRepo.git#egg=ExampleRepo-0.1'
    ]

)

答案 3 :(得分:1)

一个更一般的答案,从我做的requeriments.txt文件中获取信息:

from setuptools import setup, find_packages
from os import path

loc = path.abspath(path.dirname(__file__))

with open(loc + '/requirements.txt') as f:
    requirements = f.read().splitlines()

required = []
dependency_links = []
# do not add to required lines pointing to git repositories
EGG_MARK = '#egg='
for line in requirements:
    if line.startswith('-e git:') or line.startswith('-e git+') or \
            line.startswith('git:') or line.startswith('git+'):
        if EGG_MARK in line:
            package_name = line[line.find(EGG_MARK) + len(EGG_MARK):]
            required.append(package_name)
            dependency_links.append(line)
        else:
            print('Dependency to a git repository should have the format:')
            print('git+ssh://git@github.com/xxxxx/xxxxxx#egg=package_name')
    else:
        required.append(line)

setup(
    name='myproject',  # Required
    version='0.0.1',  # Required
    description='Description here....',  # Required
    packages=find_packages(),  # Required
    install_requires=required,
    dependency_links=dependency_links,
) 

答案 4 :(得分:1)

实际上,如果您希望递归安装软件包(YourCurrentPackage包括SomePrivateLib),例如当您希望将YourCurrentPackage包含在另一个文件中(例如OuterPackage-> YourCurrentPackage-> SomePrivateLib)时,您将同时需要这两者:

install_requires=[
    ...,
    "SomePrivateLib @ git+ssh://github.abc.com/abc/SomePrivateLib.git@0.1.0#egg=SomePrivateLib"
],
dependency_links = [
    "git+ssh://github.abc.com/abc/SomePrivateLib.git@0.1.0#egg=SomePrivateLib"
]

并确保您已使用版本号创建标签。

如果您的git项目是私有的,并且您想将其安装在容器中,例如Docker或GitLab运行程序,您将需要对存储库的授权访问。请考虑将git + https与访问令牌一起使用(例如在GitLab上:https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html):

import os
from setuptools import setup

TOKEN_VALUE = os.getenv('EXPORTED_VAR_WITH_TOKEN')

setup(
    ....

    install_requires=[
            ...,
            f"SomePrivateLib @ git+https://gitlab-ci-token:{TOKEN_VALUE}@gitlab.server.com/abc/SomePrivateLib.git@0.1.0#egg=SomePrivateLib"
    ],
    dependency_links = [
            f"git+https://gitlab-ci-token:{TOKEN_VALUE}@gitlab.server.com/abc/SomePrivateLib.git@0.1.0#egg=SomePrivateLib"
    ]
)

答案 5 :(得分:0)

我在gitlab中成功使用了这3个选项。我正在使用gitlab版本11。

选项1-未指定令牌。 Shell会提示您输入用户名/密码。

from setuptools import setup

TOKEN_VALUE = os.getenv('EXPORTED_VAR_WITH_TOKEN')

setup(
    install_requires=[
        "SomePrivateLib @ git+https://gitlab.server.com/abc/SomePrivateLib.git@0.1.0#egg=SomePrivateLib"
    ]
)

选项2-指定的用户访问令牌。转到gitlab>帐户右上角>设置>访问令牌生成的令牌。创建具有read_repository权限的令牌。

示例:

import os
from setuptools import setup

TOKEN_VALUE = os.getenv('EXPORTED_VAR_WITH_TOKEN')

setup(
    install_requires=[
        f"SomePrivateLib @ git+https://gitlab-ci-token:{TOKEN_VALUE}@gitlab.server.com/abc/SomePrivateLib.git@0.1.0#egg=SomePrivateLib"
    ]
)

选项3-指定的存储库级别令牌。转到存储库>设置>存储库>部署令牌生成的令牌。从这里创建一个具有read_repository权限的令牌。

示例:

import os
from setuptools import setup

TOKEN_USER = os.getenv('EXPORTED_TOKEN_USER')
TOKEN_VALUE = os.getenv('EXPORTED_VAR_WITH_TOKEN')

setup(
    install_requires=[
        f"SomePrivateLib @ git+https://{TOKEN_USER}:{TOKEN_VALUE}@gitlab.server.com/abc/SomePrivateLib.git@0.1.0#egg=SomePrivateLib"
    ]
)

在这3种方法中,我都可以简单地完成:“ SomePrivateLib @ git + https://gitlab.server.com/abc/SomePrivateLib.git”,而末尾没有#egg标记。