我正在为项目创建一个setup.py
文件,该文件依赖于私有GitHub存储库。该文件的相关部分如下所示:
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
,因为后者不支持install_requires
和dependency_links
每个this答案的参数。
上面的安装文件无法访问带有404错误的私有存储库 - 这是预期的,因为GitHub会将404返回到未经授权的私有存储库请求。但是,我无法弄清楚如何进行setuptools
身份验证。
以下是我尝试过的一些事情:
在git+ssh://
中使用https://
代替dependency_links
,就像使用pip
安装回购时一样。这失败是因为setuptools无法识别此协议(“未知网址类型:git + ssh”),尽管distribute documentation表示应该这样做。同上git+https
和git+http
。
https://<username>:<password>@github.com/...
- 仍然获得404.(此方法不能与命令行中的curl
或wget
一起使用 - 尽管curl -u <username> <repo_url> -O <output_file_name>
可以正常工作。)
将setuptools(0.9.7)和virtualenv(1.10)升级到最新版本。虽然this overview表示它已合并回setuptools,但还尝试安装分发版。无论哪种方式,都没有骰子。
目前我只有setup.py
打印出一个警告,即必须单独下载私人存储库。这显然不太理想。我觉得有一些显而易见的东西让我失踪,但却想不到它会是什么。 :)
没有答案here的重复问题。
答案 0 :(得分:39)
这对我有用:
install_requires=[
'private_package_name==1.1',
],
dependency_links=[
'git+ssh://git@github.com/username/private_repo.git#egg=private_package_name-1.1',
]
请注意,您必须在蛋名中包含版本号,否则会说它找不到包。
答案 1 :(得分:23)
我试图通过pip进行安装,但以上内容对我而言不起作用。从[1]我理解应该使用PEP508标准,从[2]我检索到一个确实有效的示例(至少对我而言)。
请注意;这是pip 18.1
上的Python3.6
setup(
name='<package>',
...
install_requires=[
'<normal_dependency>',
'<dependency_name> @ git+ssh://git@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
答案 2 :(得分:8)
我找不到任何关于此的好文档,但主要是通过试用和解决方案来找到解决方案。错误。此外,从pip&amp; amp; 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)
]
这里有几点说明:
0
),即使PyPI上没有包也是如此。这必须是一个实际的数字,而不是一个字。git+
前面告诉setuptools克隆回购,而不是指向zip / tarball version
可以是分支,标记或提交哈希--process-dependency-links
答案 3 :(得分: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'] )
我理解在设置脚本中进行系统调用存在道德问题,但我想不出另一种方法可以做到这一点。
答案 4 :(得分:2)
使用来自github的存档URL对我来说适用于公共存储库。 E.g。
dependency_links = [
'https://github.com/username/reponame/archive/master.zip#egg=eggname-version',
]
答案 5 :(得分:0)
编辑:这似乎只适用于公共github存储库,请参阅注释。
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的链接中。
答案 6 :(得分:0)
通过汤姆·海姆斯(Tom Hemmes)的回答,我发现这是唯一对我有用的东西:
install_requires=[
'<package> @ https://github.com/<username>/<package>/archive/<branch_name>.zip']
答案 7 :(得分:0)
使用 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
答案 8 :(得分:-1)
我们的方案的这项工作:
https://github.com/pypa/pip/issues/3610#issuecomment-356687173