提问者:小点点

如何编写setup.py以包含Git存储库作为依赖项


我正在尝试为我的包编写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

我得到

找不到满足要求的版本

我做错了什么?


共3个答案

匿名用户

注意:这个答案现在已经过时了。看看这个答案的最新说明:https://stackoverflow.com/a/54701434/212774

在挖掘了上面注释中@muon链接的pip问题3939和PEP-508规范后,我发现成功地通过setup.py使用install_requires中的这种规范模式安装了我的私有repo依赖项(不再有dependency_links):

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

@v1.1表示在github上创建的发布标签,可以替换为分支、提交或不同类型的标签。

匿名用户

滚动到底部以获取最新的答案,或者通读以查看它是如何演变的。

不幸的是,公认的答案不适用于私有存储库,这是最常见的用例之一。

我最终使用了一个看起来像这样的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_org/ExampleRepo.git#egg=ExampleRepo-0.1'
    ]
)

更新版本的pip通过消除使用“dependency_links”的需要使这变得更加容易-

from setuptools import setup, find_packages

setup(
    name = 'MyProject',
    version = '0.1.0',
    url = '',
    description = '',
    packages = find_packages(),
    install_requires = [
        # Github Private Repository
        'ExampleRepo @ git+ssh://git@github.com/example_org/ExampleRepo.git#egg=ExampleRepo-0.1'
    ]
)

然而,使用最新的pip,你会遇到EGG格式处理程序的问题。这是因为当鸡蛋被忽略时,pip现在正在进行直接URL匹配,并且会考虑两个URL,一个有鸡蛋片段,另一个没有,即使它们指向同一个包,也是完全不同的版本。因此,最好不要使用任何鸡蛋片段。

因此,将Github依赖项添加到公共和私有存储库的setup.py的最佳方式(当前为2021年6月):

from setuptools import setup, find_packages

setup(
    name = 'MyProject',
    version = '0.1.0',
    url = '',
    description = '',
    packages = find_packages(),
    install_requires = [
        # Github Private Repository
        'ExampleRepo @ git+ssh://git@github.com/example_org/ExampleRepo.git'
    ]
)

显然setup.py正在被弃用(尽管我猜它会存在一段时间),而set. cfg是新事物。

[metadata]
name = MyProject
version = 0.1.1


[options]
packages = :find

install_requires =
  ExampleRepo @ git+ssh://git@github.com/example_org/ExampleRepo.git

settings. cfg已经“预”弃用。因为setuptools现在对pyproject.toml文件有实验性支持。

这是未来,但由于这仍然是实验性的,所以现在不应该在实际项目中使用。即使settings. cfg即将过时,您也应该将其用于声明性格式,否则setup.py仍然是要走的路。当setuptools稳定了对新标准的支持后,这个答案将被更新。

现在可以在pyproject. toml中定义所有依赖项。设置.cfg等其他选项仍然有效。

[build-system]
requires = ["setuptools", "setuptools-scm"]
build-backend = "setuptools.build_meta"

[project]
dependencies = [
    'ExampleRepo @ git+ssh://git@github.com/example_org/ExampleRepo.git',
]

[project.optional-dependencies]
dev = ['ExtraExample @ git+ssh://git@github.com/example_org/ExtraExample.git']

匿名用户

注意:这个答案现在已经过时了。看看这个答案的最新说明:https://stackoverflow.com/a/54701434/212774

你可以在这里找到正确的方法。

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

关键不是提供指向Git存储库的链接,而是指向tarball的链接。如果您附加/tarball/master,GitHub会为您创建master分支的tarball,如上所示。