我第一次使用 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 服务器通常需要运行在代理之后,并且你需要一些工具来正确管理用户访问。然而,这些细节超出了本文的范围。
2 条评论