web-dev-qa-db-de.com

Benutzerdefinierter Speicherort für die .pypirc-Datei

Ermöglicht setuptools die Angabe der .pypirc-Datei an einem benutzerdefinierten Speicherort anstelle von $HOME/.pypirc? Ich richte einen Jenkins-Job für die Veröffentlichung in einem internen Repository ein und möchte, dass sich die .pypirc-Datei im Arbeitsbereich des Jobs befindet.

15
Srikanth

Dies ist möglich, indem die Standardbefehlsklassen, die für die Kommunikation mit dem PyPI oder Ihrem benutzerdefinierten Repository-Server verwendet werden, überladen werden. Dies kann in Ihrem setup.py-Skript erfolgen. Lassen Sie den Code zuerst sprechen:

# this is your project's setup.py script

import os
from distutils.command.register import register as register_orig
from distutils.command.upload import upload as upload_orig

from setuptools import setup


class register(register_orig):

    def _get_rc_file(self):
        return os.path.join('.', '.pypirc')

class upload(upload_orig):

    def _get_rc_file(self):
        return os.path.join('.', '.pypirc')

setup(
    name='myproj',
    ...
    cmdclass={
        'register': register,
        'upload': upload,
    }
)

Wenn Sie jetzt z.

$ python setup.py sdist register upload

die Serveranmeldeinformationen werden aus .pypirc im Projektverzeichnis anstelle der Standardanmeldeinformationen für ~/.pypirc übernommen.

Im Grunde müssen Sie also nur die Befehle register und upload durch Ihre eigenen Implementierungen ersetzen. Diese Implementierungen definieren die _get_rc_file-Methode mit Ihrer eigenen Logik neu. Vergessen Sie danach nicht, das Argument cmd_class in Ihrer Funktion setup so anzupassen, dass Ihre eigenen Befehlsklassen anstelle der Standardklassen verwendet werden.

Da beide Klassen dieselbe Methode neu definieren, können Sie den Code natürlich z. Schreiben und Wiederverwenden einer Mixin-Klasse usw. Wenn Sie die Sphinx-Dokumente über den Befehl upload_docs in PyPI hochladen, müssen Sie sie auf dieselbe Weise überladen. Wie auch immer, Sie sollten die Grundidee zum Überladen von Befehlen aus dem obigen Snippet erhalten.

6
hoefling

Vielleicht möchten Sie Schnur auschecken. Mit diesem Tool können Sie über die Option .pypirc eine benutzerdefinierte --config-file-Datei angeben.

3
mattmilten

In der letzten Version von setuptools (Version 29.0.1) wird die Datei .pypirc aus dem Verzeichnis $HOME (oder %USERPROFILE% unter Windows) geladen.

Dies geschieht in der Klasse setuptools.package_index.PyPIConfig. Siehe den Quellcode auf GitHub:

class PyPIConfig(configparser.RawConfigParser):
    def __init__(self):
        """
        Load from ~/.pypirc
        """
        defaults = dict.fromkeys(['username', 'password', 'repository'], '')
        configparser.RawConfigParser.__init__(self, defaults)

        rc = os.path.join(os.path.expanduser('~'), '.pypirc')
        if os.path.exists(rc):
            self.read(rc)

Die einzige Lösung, die ich sehe, besteht darin, die Umgebungsvariable HOME vorübergehend neu zu definieren, bevor der Jenkins-Job ausgeführt wird.

1
Laurent LAPORTE