如何在没有镜像的情况下创建本地自己的 PyPI 存储库索引?

问题描述 投票:0回答:5

我们有几个自己的Python包,并希望使用简单的接口为它们创建本地PyPI存储库,如https://pypi.python.org/simple/

由于安全原因,我只想在本地创建这个存储库,没有任何镜像,它将置于 Apache 的控制之下。

命令

pypimirror
看起来必须初始化一次,它需要镜像。

如何根据本地Python包生成PyPI简单索引?

还有另一个简单的脚本吗?

python pip pypi
5个回答
31
投票

我们公司也有类似的需求。基本上,我们如何将“闭源”包上传到索引,同时能够像在 PyPI 上一样安装它们?

我们赞助了一个名为 devpi 的项目,它充当 PyPI 缓存(您从 PyPI 访问的包将缓存在您的服务器上)以及强大而快速的索引服务器。该文档位于 http://doc.devpi.net/latest/

路线图的下一步是多地理部署的镜像。踢机器轮胎大约需要 5 分钟(请参阅快速入门指南)。最后,devpi 与 pip 和 easy_install 兼容(即您不需要在计算机上安装 devpi 客户端)。

希望这有帮助。


27
投票

既然你要求在这里回答:

看看

pip2pi
,它似乎正是您要找的。


17
投票

最简单的方法是将包 distfiles 组织到以包命名的目录中并运行一个简单的 HTTP 服务器。不需要额外的包,Python的stdlib就足够了。目录结构示例:

└── repodir
    ├── setuptools
    │   ├── setuptools-38.1.0-py2.py3-none-any.whl 
    │   ├── setuptools-38.1.0.zip
    │   ├── setuptools-39.2.0-py2.py3-none-any.whl 
    │   └── setuptools-39.2.0.zip
    ├── wheel
    │   └── wheel-0.31.1-py2.py3-none-any.whl 
    ...

启动服务器:

$ cd repodir/
$ python3 -m http.server 9000
$ # or for Python 2:
$ python2 -m SimpleHTTPServer 9000

本地存储库已启动并正在运行。现在您可以将存储库传递给

pip
:

$ pip install wheel --extra-index-url=http://127.0.0.1:9000

或者甚至将存储库 URL 保留在

pip.conf
中,以免每次都输入它:

# pip.conf
[global]
extra-index-url=http://127.0.0.1:9000

参考:Python 打包用户指南,托管您自己的简单存储库


7
投票

镜子没什么特别的,可以用

mod_rewrite
自己设置。

  1. 将包转储到映射到 URL 的目录中。这里我用

    /url/to/my/pypi/
    作为一个例子。文件夹层次结构应为
    /foo/bar/simple/[name of package]/[name of tarball]

  2. 将以下内容添加到

    .htaccess
    或包所在目录的全局配置中。最后一行是回退到全局 pypi 索引:

    Options +Indexes
    
    RewriteEngine On
    
    RewriteRule ^/robots.txt - [L]
    RewriteRule ^/icons/.* - [L]
    RewriteRule ^/index\..* - [L]
    
    RewriteCond /foo/bar/simple/ !-f
    RewriteCond /foo/bar/simple/ !-d
    RewriteRule ^/(.*)/?$ http://pypi.python.org/ [R,L]
    
  3. 更新您的

    ~/.pip/pip.conf
    以指向新存储库:

    [global]
    index-url = http://localhost/url/to/my/pypi/
    

    或者在命令行中使用

    -i http://localhost/url/to/my/pypi/
    选项。


3
投票

如果您正在谈论运行 simplepypi 那么您将拥有用于添加包并提供它们的服务器。 引用文档:

- Running this on the setup.py of your favorite package:

    python setup.py sdist upload -r local

如果您要在本地站点包目录上使用

os.walk
glob.glob
,您可以快速过滤每个包/目录中的
setup.py
并对其调用上述内容。

如果您只需要创建一个包含 .html 列表的 tar.gz 文件目录,那么您可以在站点包目录的顶层使用 glob.glob - tar.gz 每个目录,然后添加生成的文件名到一个列表 - 然后您可以从该列表生成您的index.html。

您可以为此使用大量模板引擎中的任何一个或自己生成:

import glob
filelist = glob.glob("*.tar.gz")
tags = ['<A href="file:Where/%s">%s</A>' % (s,s) for s in tags]
head = """<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<TITLE></TITLE>
<META NAME="Generator" CONTENT="Python Script">
<META NAME="Keywords" CONTENT="Cheeseshop">
<META NAME="Description" CONTENT="List of local python packages">
</HEAD>

<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#FF0000" VLINK="#800000" ALINK="#FF00FF" BACKGROUND="?">
"""
tail = """</BODY></HTML>"""
tags.insert(0,head)
tags.append(tail)
page = "\n".join(tags)

然后保存或为您提供页面。

© www.soinside.com 2019 - 2024. All rights reserved.