【问题标题】:how to create local own pypi repository index without mirror?如何在没有镜像的情况下创建本地自己的 pypi 存储库索引?
【发布时间】:2013-08-05 19:25:15
【问题描述】:

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

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

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

如何根据本地 python 包生成 PyPi 简单索引。

还有其他简单的脚本吗?

【问题讨论】:

标签: python pip pypi


【解决方案1】:

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

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

    python setup.py sdist upload -r local

如果您要在本地站点包目录中使用os.walkglob.glob,您可以快速过滤每个包/目录中的setup.py 并在它们上调用上述内容。

如果您只需要创建一个包含 .html 列表的 tar.gz 文件目录,那么您可以在站点包目录的顶层使用 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)

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

【讨论】:

    【解决方案2】:

    镜像没什么特别的,可以使用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/ 选项。

    【讨论】:

    • 您只需要按照问题要求对“仅限本地”执行步骤#2 的“选项+索引”部分。但是对于非本地的东西透明地重定向到 pypi 也是有用的。 :)
    【解决方案3】:

    既然你在这里要求回答:

    看看pip2pi,它似乎正是你要找的。

    【讨论】:

    • 这是我的情况最简单的处理方式
    • 看起来pip2pi 是为已经在 PyPI 上的公共包设计的,对吗?我认为最初的问题是关于为内部开发的包创建一个存储库。
    • 这似乎没有维护。 A major bug 于 4 月报告,维护者尚未解决。 PR to fix it 也会被忽视。
    • 我同意@BrianMcCutchon。我只是浪费了两天时间试图让 pip2pi 工作,然后才发现一个(或多个)导致它对我不起作用的错误。如果您正在开发 Web 应用程序,我建议使用 pypiserver,因为这就是我最终使用的。如果您正在开发 Python 应用程序,dev.pi 可能是更好的选择。只是不要使用 pip2pi。
    • @Jim 嗯,PR终于合并了,维护者又加了一个维护者,现在可能会更好维护。
    【解决方案4】:

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

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

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

    希望对您有所帮助。

    【讨论】:

    • 对于我的简单案例来说有点矫枉过正,但我​​投了票,因为它看起来相当稳定且易于使用。
    • devpi 正是我想要的。它充当 pypi 服务器,您可以使用默认的pip 命令来管理包。易于设置和使用。为了在虚拟环境中使用,可以在 post(de)activate 挂钩中启动/停止守护进程。
    【解决方案5】:

    最简单的方法是将包 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
    

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

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

    甚至将 repo URL 保存在 pip.conf 中以不每次都输入它:

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

    参考:Python Packaging user Guide, Hosting your own simple repository

    【讨论】:

      猜你喜欢
      • 2018-05-08
      • 2016-11-22
      • 1970-01-01
      • 2011-11-05
      • 2017-04-09
      • 2023-02-24
      • 2020-02-26
      • 2018-06-26
      • 2020-01-31
      相关资源
      最近更新 更多