Разрешает ли setuptools
указать файл .pypirc
в пользовательском месте, а не $HOME/.pypirc
? Я создаю задание jenkins для публикации во внутреннем репозитории и хочу, чтобы файл .pypirc
находился внутри рабочей области задания.
Пользовательское расположение файла .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.