如何设置 DevPI,一个与 PyPI 兼容的 Python 开发服务器

在这个有用的教程中学习如何安装和配置 DevPI。
321 位读者喜欢这篇文章。
How do we fix the state of technical documentation?

Victor 通过 Flickr。CC BY 2.0

我第一次使用 DevPI 时,我正在为和妻子孩子们一起去露营旅行做准备。我说的“做准备”不是指练习制作烤棉花糖的技巧。我的意思是,我知道孩子们会在某些时候被营地工作人员逗乐,我计划修复 Twisted 包中的一些错误。我也知道露营地没有网络,所以我需要能够在不连接互联网的情况下进行开发。

一个天真的人会准备虚拟环境;然而,虚拟环境应该是可抛弃的,而不是珍贵的。许多工具会在配置更改时丢弃并重新创建虚拟环境。我需要知道我所有的软件包都可用。 那是我第一次接触 DevPI

DevPI 是一个与 PyPI 兼容的服务器,你可以在本地运行它。它不会,也不试图扩展到 PyPI 级别的规模。作为回报,在本地运行它很简单,而且没有多余的功能。

DevPI 由三个部分组成。最重要的部分是 devpi-server。对于许多用途来说,这是唯一需要运行的部分。该服务器首先充当 PyPI 的缓存代理。它利用了 PyPI 上的软件包是不可变的这一事实:一旦你拥有了一个软件包,它就永远不会改变。

还有一个 Web 服务器,它允许你在本地软件包目录中搜索。因为很多用途甚至不涉及在 PyPI 网站上搜索,所以这是可选的。最后,还有一个客户端命令行工具,允许你配置运行实例上的各种参数。该客户端在更深奥的用例中最有用。

安装和运行 DevPI 非常简单。在虚拟环境中,只需运行

(devpi)$ pip install devpi-server
(devpi)$ devpi-server --start --init

默认情况下,pip 工具会连接到 pypi.org。对于 DevPI 的一些基本测试,你可以创建一个新的虚拟环境或 playground 并运行

(playground)$ pip install \
-i http://localhost:3141/root/pypi/+simple/ \
httpie glom
(playground)$ http --body https://httpbin.org/get | glom ’{"url":"url"}’
{
"url": "https://httpbin.org/get"
}

当然,每次都必须为 pip 指定 -i … 参数会很烦人。在检查一切正常后,你可以将配置放在环境变量中

$ export PIP_INDEX_URL=http://localhost:3141/root/pypi/+simple/

或者,为了使事情更持久

$ mkdir -p ~/.pip && cat > ~/.pip/pip.conf << EOF
[global]
index-url = http://localhost:3141/root/pypi/+simple/
[search]
index = http://localhost:3141/root/pypi/

上述文件位置适用于 Unix 操作系统。在 MacOS 上,配置文件是 $HOME/Library/Application Support/pip/pip.conf。在 Windows 上,配置文件是 %APPDATA%\pip\pip.ini

要“预热” DevPI 缓存(即,确保它包含所有需要的软件包),请使用 pip 安装它们。在我配置 DevPI 和 pip 之后,我选择这样做的方式是 git clone Twisted 存储库并运行 tox。由于 tox 会遍历测试环境,包括那些包含大量软件包的环境,因此它会下载所有需要的软件包。

一个好的做法也是在一次性虚拟环境中预先安装你拥有的任何 requirements.txt 文件;但是,DevPI 的实用性不仅限于断开连接的操作。如果你在你的构建集群内部配置一个 DevPI 并将构建集群指向它,你就可以完全避免“leftpad 事件”的风险,即你依赖的软件包被作者从 PyPI 中删除。它也可能使构建更快,并且肯定会减少大量出站流量。

DevPI 的另一个用途是在将上传内容上传到 PyPI 之前对其进行测试。假设 devpi-server 已经在默认端口上运行,你可以运行

(devpi)$ pip install devpi-client twine
(devpi)$ devpi use http://localhost:3141
(devpi)$ devpi user -c testuser password=123
(devpi)$ devpi login testuser --password=123
(devpi)$ devpi index -c dev bases=root/pypi
(devpi)$ devpi use testuser/dev
(devpi)$ twine upload --repository http://localhost:3141/testuser/dev \
-u testuser -p 123 my-package-18.6.0.tar.gz
(devpi)$ pip install -i http://localhost:3141/testuser/dev my-package

请注意,这允许上传到仅显式使用的索引,因此你不会为所有未显式使用它的环境遮蔽 my-package

对于更高级的用例,你可以这样做

(devpi)$ devpi index root/pypi mirror_url=https://ourdevpi.local

这将使 DevPI 服务器成为本地“上游” DevPI 服务器的镜像。这允许将私有软件包上传到“中央” DevPI 服务器,以便与你的团队共享。在这些情况下,上游 DevPI 服务器通常需要运行在代理之后,并且你需要一些工具来正确管理用户访问。然而,这些细节超出了本文的范围。

Moshe sitting down, head slightly to the side. His t-shirt has Guardians of the Galaxy silhoutes against a background of sound visualization bars.
Moshe 自 1998 年以来一直参与 Linux 社区,并在 Linux “安装聚会”中提供帮助。他自 1999 年以来一直在编写 Python 程序,并为核心 Python 解释器做出了贡献。Moshe 在 DevOps/SRE 这些术语出现之前就已经是 DevOps/SRE 了,他非常关心软件可靠性、构建可重现性等。

2 条评论

您好,我尝试安装它。一切进展顺利,但在 (devpi)$ pip install -i http://localhost:3141/testuser/dev my-package 处,它显示错误。我尝试了你的 localhost ID 以及我自己的,但它都不起作用。请帮帮我。 www.magentodevelopment.net

我对学习 PHP、Python 感兴趣。这篇文章对我的网站很有帮助。谢谢你的分享。

Creative Commons License本作品根据 Creative Commons 许可协议 授权。
© . All rights reserved.