把Github用作Pypi Server

Posted 赖勇浩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了把Github用作Pypi Server相关的知识,希望对你有一定的参考价值。

因为觉得有参考价值,一直打开许多页面没有关闭,浏览器的 tab 都差不多上百了,决心把一些有意义的内容通过翻译、摘录和重编的形式把核心内容快速统一到博客上来,方便后续检索,也好关掉一些浏览器窗口。

本文是 How to use GitHub as a PyPi server的翻译、摘录和重编,原作者cedd burge,我加入了一些pip配置和网页源码之类的内容,让它更加顺畅和完整。

首先是有很多私有 Pypi Server 方案,但需要自己架设,cedd哥不想干这事,只想白嫖,最后他成功了,本文就是他的方案。

首先,pip是可以从Git里安装程序包的,比如cedd哥在github托管了一个python_world的项目,这个项目的代码结构是符合Python包规范的,那么就可以通过以下命令把这个包安装到电脑:

pip install git+https://github.com/ceddlyburge/python_world#egg=python_world

因为这个项目是开源(公开)的,谁都可以读取,所以这个没有问题。

除此之外,setuptools也可以从git安装setup.py里声明的依赖包,比如cedd哥在github上托管一个叫python_hello的包,它需要刚才说的python_world包才能运行,那么可以在它的setup.py里通过install_requires声明依赖,这个声明也是兼容从git安装的:

install_requires=[
	'python_world@git+https://github.com/ceddlyburge/python_world#egg=python_world-0.0.1',
]

所以当你用下面这句命令安装python_hello的时候,它不仅会从github下载自己,还会下载python_world,一并装上:

pip install git+https://github.com/ceddlyburge/python_hello#egg=python_hello

但如果一直写这么长的命令,就让人很烦了,那么其实可以把这个依赖写入到requirements.txt中,然后每次只需要执行pip install -r requirements.txt即可,省去了许多细节。

但是,如果我们想要用最常见的pip install python_hello来安装,那么就还需要一个Pypi Server,它提供由Pep 503定义的Pypi索引规范。其实这个索引很简单,手工都可以撸出来,cedd哥就撸了一个,通过github pages站点提供服务,就是这个啦,打开可以看到有个python_world的超链接,链接到项目页面,这个页面只有一个带版本号的链接,指向git安装地址。页面的关键元素如下:

<a href="git+https://github.com/ceddlyburge/python_world#egg=python_world-0.0.1" data-requires-python=">=3.6.0">python_world-0.0.1</a>

这个站点的源代码在这里,确实是非常简单的。有了 Pypi Server 之后,就可以使用下面这个命令来安装了:

pip install python_hello --extra-index-url https://ceddlyburge.github.io/python-package-server/

这个时候,你只需要在pip的配置文件(~/.pip/pip.conf)中把--extra-index-url https://ceddlyburge.github.io/python-package-server/参数隐藏起来,就可以用简短的pip install python_hello安装了。

结论就是使用云托管的git作为 Pypi Server是可行的,对,不仅仅是 github,其它git托管厂商也可以的,国内的也可以,有pages服务的尤其好,另外就是私有仓库也是支持的,就是拉取代码的时候,需要输入账号密码(如有)或者需要提前配置好SSH证书。

以上是关于把Github用作Pypi Server的主要内容,如果未能解决你的问题,请参考以下文章

把Github用作Pypi Server

如何让安装工具安装 github 分叉的 PyPI 包?

使用国内pypi源来安装python包

使用pypi-server搭建简单的PyPI源

[Pipy]利用pip2pi搭建本地pypi源

pypi镜像源