Пользовательское расположение файла .pypirc

Разрешает ли setuptools указать файл .pypirc в пользовательском месте, а не $HOME/.pypirc? Я создаю задание jenkins для публикации во внутреннем репозитории и хочу, чтобы файл .pypirc находился внутри рабочей области задания.

Ответ 1

Возможно, вы захотите проверить twine. Этот инструмент позволяет указать пользовательский .pypirc файл с помощью опции --config-file

Ответ 2

Это можно выполнить, перегружая классы команд по умолчанию, используемые для связи с PyPI или вашим сервером репозитория. Это можно сделать в setup.py script. Позвольте коду сначала поговорить:

# this is your project 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,
    }
)

Теперь, если вы вызываете, например,

$ python setup.py sdist register upload

учетные данные сервера будут взяты из .pypirc в каталоге проекта, а не по умолчанию ~/.pypirc.

В основном, все, что вам нужно сделать, это заменить команды register и upload на собственные реализации. Эти реализации переопределяют метод _get_rc_file с помощью вашей собственной логики. После этого не забудьте отрегулировать аргумент cmd_class в вашей функции setup, чтобы вместо стандартных использовались ваши собственные классы команд.

Конечно, поскольку оба класса переопределяют один и тот же метод, вы можете преффицировать код, например. написания класса mixin и повторного использования его и т.д. Кроме того, если вы загружаете документы sphinx в PyPI через команду upload_docs, вы должны перегружать ее таким же образом. В любом случае, вы должны получить основную идею перегрузки команд из фрагмента выше.

Ответ 3

В последней версии setuptools (версия 29.0.1) файл .pypirc загружается из каталога $HOME (или %USERPROFILE% в Windows).

Это выполняется в классе setuptools.package_index.PyPIConfig. Смотрите исходный код на 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)

Итак, единственным решением, которое я вижу, является временное переопределение переменной среды HOME перед запуском задания Jenkins.