我正在尝试为我的包编写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
我得到
找不到满足要求的版本
我做错了什么?
注意:这个答案现在已经过时了。看看这个答案的最新说明: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,如上所示。