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

时间:2013-08-05 06:58:26

标签: python pip pypi

我们有几个自己的python包,想要使用像https://pypi.python.org/simple/这样的简单界面为它们创建本地pypi存储库

由于安全原因,我想在没有任何镜像的情况下为本地创建此存储库,它将被置于apache的控制之下

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

如何基于本地python包生成PyPi Simple Index。

还有其他简单的脚本吗?

5 个答案:

答案 0 :(得分:24)

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

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

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

希望这有帮助。

答案 1 :(得分:20)

由于您要求在此处回答:

看看pip2pi,它似乎正是您正在寻找的。

答案 2 :(得分: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 :(得分:3)

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

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

    python setup.py sdist upload -r local

如果您在本地site-packages目录中使用os.walkglob.glob,则可以快速过滤每个软件包/目录中的setup.py并在其上调用上述内容

如果您只需要创建一个tar.gz文件目录,并附上.html列表,那么您可以在site-packages目录的顶层使用glob.glob - 依次tar.gz每个目录将生成的文件名添加到列表中 - 然后您可以从该列表生成index.html。

您可以使用大量template引擎中的任何一个或自行生成:

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)

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

答案 4 :(得分:3)

最简单的方法是将distfiles包组织到名为dirs的包中,并运行一个简单的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 Packaging user Guide, Hosting your own simple repository