web-dev-qa-db-fra.com

Emplacement personnalisé pour le fichier .pypirc

setuptools permet-il de spécifier le fichier .pypirc dans un emplacement personnalisé plutôt que $HOME/.pypirc? Je suis en train de configurer un travail jenkins pour publication dans un référentiel interne et je souhaite que le fichier .pypirc se trouve dans l'espace de travail du travail.

15
Srikanth

Cela est possible en surchargeant les classes de commandes par défaut utilisées pour la communication avec PyPI ou votre serveur de référentiel personnalisé. Cela peut être fait dans votre script setup.py. Laissez le code parler en premier:

# 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,
    }
)

Maintenant, si vous appelez par exemple.

$ python setup.py sdist register upload

les informations d'identification du serveur seront extraites de .pypirc dans le répertoire du projet au lieu de celui par défaut ~/.pypirc.

En gros, tout ce que vous avez à faire est de remplacer les commandes register et upload par vos propres implémentations. Ces implémentations redéfinissent la méthode _get_rc_file avec votre propre logique. Après cela, n'oubliez pas de régler l'argument cmd_class dans votre fonction setup afin que vos propres classes de commandes soient utilisées à la place des classes standard.

Bien sûr, à mesure que les deux classes redéfinissent la même méthode, vous pouvez prettifier le code, par exemple. écrire une classe mixin et la réutiliser, etc. etc. De plus, si vous téléchargez les documents sphinx sur PyPI via la commande upload_docs, vous devez les surcharger de la même manière. Quoi qu'il en soit, vous devriez vous faire une idée de base de la surcharge de commande à partir de l'extrait de code ci-dessus.

6
hoefling

Vous voudrez peut-être consulter twine . Cet outil vous permet de spécifier un fichier .pypirc personnalisé via l'option --config-file.

3
mattmilten

Dans la dernière version de setuptools (version 29.0.1), le fichier .pypirc est chargé à partir du répertoire $HOME (ou %USERPROFILE% sous Windows).

Ceci est fait dans la classe setuptools.package_index.PyPIConfig. Voir le code source sur 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)

La seule solution que je vois est donc de redéfinir temporairement la variable d'environnement HOME avant d'exécuter le travail Jenkins.

1
Laurent LAPORTE