跳转到主要内容

未提供项目描述

项目描述

笨PyPI

Build Status PyPI version

笨PyPI是一个简单的只读PyPI索引服务器生成器,完全由静态文件支持。它非常适合组织内部使用,这些组织有一堆自己的包,希望使它们可用。

您可以查看一个示例生成的仓库

关于静态文件(以及为什么你应该使用笨PyPI)的抱怨

笨PyPI与其他PyPI实现之间的主要区别在于,笨PyPI没有服务器组件。它只是一个脚本,给定一个Python包名列表,生成一些静态文件,您可以从任何Web服务器提供,甚至直接从S3。

能够完全从静态文件树中提供包仓库是件神奇的事情。当您不需要担心运行大量应用程序服务器(它们正在处理大量只读查询,这些查询本可以预先生成)时,使其快速且高度可用变得非常容易。

Linux发行版已经正确地做了几十年。Debian有一个由数百个镜像组成的系统,整个系统完全由一些复杂的rsync命令驱动。

对于PyPI仓库的维护者,笨PyPI有一些不错的特性

  • 文件服务非常快。 nginx可以比您所需的任何速度都快地提供静态文件。在实践中,包的数量或每个包的版本数几乎没有限制。

  • 非常简单。 没有复杂的WSGI应用需要部署,没有数据库和缓存。您只需在需要新包时运行脚本,您的索引服务器几秒钟内就准备好了。

关于选择这种设计的更多原因,请参阅本仓库中的详细RATIONALE.md

使用方法

要使用dumb-pypi,您需要两样东西

  • 一个生成索引的脚本。(这正是这个项目!)

  • 一个通用的Web服务器来提供生成的索引。

    这部分取决于您。例如,您可以将构建的索引同步到S3桶中,并直接从S3提供服务。您也可以在本地从构建的索引运行nginx。

我推荐的(但仍然非常简单)高可用性部署方案是

  • 将所有包存储在S3上。

  • 有一个cronjob(或等效)根据S3中的包重建索引。这非常快——每六十秒执行一次也不算过分。在构建索引后,将其同步到另一个S3桶。

  • 有一个运行nginx(配置如下)的Web服务器(或一组位于负载均衡器后面的Web服务器),源是第二个S3桶。

生成静态文件

首先,在某个地方(例如,在虚拟环境内)安装dumb-pypi

按照设计,dumb-pypi在构建索引时不需要您提供包。您只需要一个文件名列表,每行一个。例如

dumb-init-1.1.2.tar.gz
dumb_init-1.2.0-py2.py3-none-manylinux1_x86_64.whl
ocflib-2016.10.31.0.40-py2.py3-none-any.whl
pre_commit-0.9.2.tar.gz

您还应该知道访问这些包的URL(如果您从与索引相同的宿主提供服务,则可以是相对URL)。例如,它可能是https://my-pypi-packages.s3.amazonaws.com/../../pool/

然后您可以调用脚本

$ dumb-pypi \
    --package-list my-packages \
    --packages-url https://my-pypi-packages.s3.amazonaws.com/ \
    --output-dir my-built-index

构建的索引将位于my-built-index。现在,您需要找出如何用Web服务器(nginx是一个好选择——下面有详细说明!)来提供服务。

包的附加选项

您可以通过向dumb-pypi提供包列表时使用扩展的JSON输入语法来扩展您注册表的功能。您可以使用以下格式而不是每行一个文件名,每行一个JSON对象,如下所示

{"filename": "dumb-init-1.1.2.tar.gz", "hash": "sha256=<hash>", "requires_python": ">=3.6", "uploaded_by": "ckuehl", "upload_timestamp": 1512539924, "yanked_reason": null, "core_metadata": "sha256=<hash>"}
必需? 描述
filename 文件名
hash 文件哈希值,格式为<hashalgo>=<hashvalue>
requires_python 包的Python需求字符串(PEP345
core_metadata 字符串"true"或格式为<hashalgo>=<hashvalue>的字符串,表示通过将.metadata附加到文件URL来提供此文件的元数据(PEP658PEP714
uploaded_by 用于表示包上传者的自由文本;仅显示在Web UI上
upload_timestamp 表示包上传时间的UNIX时间戳
yanked_reason 用于表示因给定原因撤回包的自由文本(PEP592
requires_dist (已弃用) requires_dist依赖项数组(PEP345),仅在JSON API中使用;请考虑使用core_metadata代替

filename键是必需的。所有其他键都是可选的,并将用于在您生成的存储库中提供更多信息。这些扩展信息非常有用,例如,可以确定谁上传了包。(其中大部分信息对人类用户在Web UI中很有用,而不是对pip。)

您在哪里获取有关哈希、上传者等信息?这取决于您——dumb-pypi 不从事存储或计算这些数据的工作。如果您使用 S3,一个简单的选项是在上传时将其存储为 S3 元数据

部分重建支持

如果您想避免不断重建整个注册表,可以向 dumb-pypi 传递 --previous-package-list(或 --previous-package-list-json)参数,指向上次调用 dumb-pypi 时使用的列表。只有与更改的软件包相关的文件将重建,这样可以节省您的时间和不必要的 I/O。

上一个软件包列表 JSON 可在输出中作为 packages.json 获得。

推荐的 nginx 配置

您可以从任何静态网页服务器(包括直接从 S3)提供软件包,但为了与旧版本的 pip 兼容,需要进行一些 URL 重新编写(有关各种 pip 版本行为的详细信息,请参阅 RATIONALE.md)。

特别是,如果您想支持旧版本的 pip,您需要将此逻辑应用于包名称(来自 PEP 503)。

def normalize(name):
    return re.sub(r'[-_.]+', '-', name).lower()

以下是一个支持所有版本 pip 和 easy_install 的 nginx 配置示例。

server {
    location / {
        root /path/to/index;
        set_by_lua $canonical_uri "return string.gsub(string.lower(ngx.var.uri), '[-_.]+', '-')";
        try_files $uri $uri/index.html $canonical_uri $canonical_uri/index.html =404;
    }
}

如果您不关心 easy_install 或 pip 8.1.2 之前的版本,可以省略 canonical_uri 修补程序。

使用 pip 与部署的索引服务器

在运行 pip 时,传递 -i https://my-pypi-server/simple 或设置环境变量 PIP_INDEX_URL=https://my-pypi-server/simple

与公共 PyPI 的已知不兼容性

我们试图保持与标准 PyPI 接口的兼容性,但由于 dumb-pypi 的设计,目前存在一些难以修复的不兼容性。

贡献

感谢您的贡献!要开始,运行 make venv,然后 . venv/bin/activate 来源虚拟环境。您现在应该在您的路径上使用您签出的代码版本具有 dumb-pypi 命令。

要运行测试,请调用 make test。要运行单个测试,您可以在激活虚拟环境后执行 pytest -k name_of_test tests(带有虚拟环境)。

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于 安装软件包 的信息。

源分布

dumb_pypi-1.15.0.tar.gz (18.4 kB 查看哈希值)

上传时间 源代码

构建发行版

dumb_pypi-1.15.0-py2.py3-none-any.whl (16.4 kB 查看哈希值)

上传时间 Python 2 Python 3

由以下支持