web-dev-qa-db-de.com

Wie erstelle ich einen lokalen eigenen Pypi-Repository-Index ohne Spiegel?

Wir haben mehrere eigene python Pakete und möchten für sie ein lokales pypi-Repository mit einer einfachen Oberfläche wie https://pypi.python.org/simple/ erstellen

Dieses Repository möchte ich aus Sicherheitsgründen nur für lokale Server ohne Spiegel erstellen und es wird unter die Kontrolle von Apache gestellt

Der Befehl pypimirror looks muss einmalig initialisiert werden und muss gespiegelt werden.

Wie kann ich PyPi Simple Index basierend auf lokalen python Paketen generieren?.

Irgendwelche anderen einfachen Skripte dafür?

32
Larry Cai

Da Sie gefragt haben, hier zu antworten:

Schauen Sie sich pip2pi , es scheint genau das zu sein, wonach Sie suchen.

20
K Z

Wir hatten in meiner Firma einen ähnlichen Bedarf. Wie können wir "Closed Source" -Pakete in einen Index hochladen, während wir sie so installieren können, als wären sie auf PyPI?

Wir haben ein Projekt namens devpi gesponsert, das als PyPI-Cache fungiert (Pakete, auf die Sie über PyPI zugreifen, werden auf Ihrem Server zwischengespeichert) sowie als leistungsstarker und schneller Indexserver. Die Dokumentation finden Sie unter http://doc.devpi.net/latest/ .

Als nächstes steht auf der Roadmap die Spiegelung für die Multi-Geos-Bereitstellung. Das Treten der Reifen auf Ihrer Maschine dauert ca. 5 Minuten (siehe Schnellstartanleitung). Schließlich ist devpi sowohl mit pip als auch mit easy_install kompatibel (d. H. Sie müssen den devpi-Client nicht auf Ihrem Computer installieren).

Ich hoffe das hilft.

24
Laurent Brack

Der Spiegel hat nichts Besonderes, und Sie können ihn mit mod_rewrite Selbst einrichten.

  1. Speichern Sie Ihre Pakete in einem Verzeichnis, das einer URL zugeordnet ist. Hier verwende ich /url/to/my/pypi/ Als Beispiel. Die Ordnerhierarchie sollte /foo/bar/simple/[name of package]/[name of tarball] Sein.

  2. Fügen Sie Folgendes zu .htaccess Oder der globalen Konfiguration für das Verzeichnis hinzu, in dem sich Ihre Pakete befinden. Der letzte Zeilenblock ist ein Rückgriff auf den globalen Pypi-Index:

    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. Aktualisieren Sie Ihren ~/.pip/pip.conf, Um auf das neue Repository zu verweisen:

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

    Oder verwenden Sie die Option -i http://localhost/url/to/my/pypi/ In der Befehlszeile.

7
Burhan Khalid

Wenn Sie über das Ausführen von simplepypi sprechen, müssen Sie auf Ihrem Server Pakete hinzufügen und ausliefern. So zitieren Sie die Dokumentation:

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

    python setup.py sdist upload -r local

Wenn Sie entweder os.walk Oder glob.glob Für Ihr lokales Site-Paketverzeichnis verwenden, können Sie in jedem der Pakete/Verzeichnisse schnell nach setup.py Filtern und die obigen Anweisungen aufrufen .

Wenn Sie nur ein Verzeichnis mit tar.gz-Dateien mit einer HTML-Liste erstellen müssen, können Sie glob.glob auf der obersten Ebene Ihres Site-Package-Verzeichnisses verwenden - tar.gz für jedes Verzeichnis einzeln und das resultierende hinzufügen Dateiname in eine Liste - Sie können dann Ihre index.html aus dieser Liste generieren.

Sie können dafür eine große Anzahl von Template Engines verwenden oder diese selbst generieren:

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)

Speichern oder servieren Sie dann die Seite.

3
Steve Barnes

Am einfachsten ist es, die Paket-Distfiles in Verzeichnisse mit Paketnamen zu organisieren und einen einfachen HTTP-Server auszuführen. Es werden keine zusätzlichen Pakete benötigt, Pythons stdlib reicht aus. Beispiel für eine Verzeichnisstruktur:

└── 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 
    ...

Starten Sie den Server:

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

Das lokale Repo ist in Betrieb. Jetzt können Sie das Repo an pip übergeben:

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

oder sogar die Repo-URL im pip.conf nicht jedes Mal eingeben:

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

Referenz: Python Packaging-Benutzerhandbuch, Hosting Ihres eigenen einfachen Repositorys

3
hoefling