未提供项目描述
项目描述
笨PyPI
笨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来提供此文件的元数据(PEP658,PEP714) |
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 的设计,目前存在一些难以修复的不兼容性。
-
虽然支持 JSON API 端点,但由于 dumb-pypi 无法检查软件包,许多 JSON API 中的键不存在。其中一些,如
requires_python
和requires_dist
,可以作为 JSON 传递。 -
针对特定版本的 JSON API 端点 仅包括有关当前请求版本的详细信息,而不是所有版本,这与公共 PyPI 不同。换句话说,如果您访问
/pypi/<package>/1.0.0/json
,您将只看到1.0.0
版本下的releases
键,而不是所有已发布的版本。常规非版本化 API 路由(/pypi/<package>/json
)将包含所有版本。
贡献
感谢您的贡献!要开始,运行 make venv
,然后 . venv/bin/activate
来源虚拟环境。您现在应该在您的路径上使用您签出的代码版本具有 dumb-pypi
命令。
要运行测试,请调用 make test
。要运行单个测试,您可以在激活虚拟环境后执行 pytest -k name_of_test tests
(带有虚拟环境)。
项目详情
下载文件
下载您平台上的文件。如果您不确定选择哪个,请了解更多关于 安装软件包 的信息。
源分布
构建发行版
dumb_pypi-1.15.0.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 9509047c9c7e0ea1a035c982abfcdec4e23c2d187df5812c2a9cb52782439f75 |
|
MD5 | f73b332b6fa4852ede72c3beefec6155 |
|
BLAKE2b-256 | 653130c7b420d45a5bbe5b75bde3507fd172e9d3454e251992f77fa977139c75 |
dumb_pypi-1.15.0-py2.py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 050e0ea9b72cf8d229331601df90173b196452df74e2a9dfa44476f6f8afc52a |
|
MD5 | aaeeb5e54784046f9305323d018e39d2 |
|
BLAKE2b-256 | 0a2bccb283f0c92adead4803ee80ba359ee43f730003907132ba12c12842074e |