Сервер по умолчанию в конфигурации нескольких серверов distutils в ~/.pypirc

Я хочу иметь несколько серверов PyPI в моем файле ~/.pypirc, чтобы я мог легко публиковать на разных серверах, в зависимости от проекта.

Мой вариант использования таков: у меня есть несколько внутренних проектов, которые я хочу опубликовать на внутреннем сервере PyPI (https://pypi.internal), и у меня есть несколько общедоступных проектов, которые я хочу опубликовать на общедоступном PyPI.

Это моя текущая попытка, но она не работает. Я хочу по умолчанию использовать internal и должен добавить -r pypi (к команде setup.py), если я хочу опубликовать на общедоступном сервере.

[distutils]
index-servers =
    internal
    pypi

[internal]
repository: https://pypi.internal
username: brad

[pypi]
username: brad

Где я ошибаюсь?


person bradley.ayers    schedule 29.03.2011    source источник


Ответы (2)


Странно, что нет встроенной поддержки установки по умолчанию, но вот два варианта, которые могут помочь вам обойти это.

Вариант 1. Вероятно, самым простым решением было бы оставить сценарий ~/.pypirc нетронутым и создать псевдонимы оболочки для внутренних и общедоступных загрузок. Это может дать вам больше контроля над настройкой вещей для вашего рабочего процесса.

Учитывая этот файл .pypirc:

[distutils]
index-servers =
    pypi
    internal

[pypi]
repository: http://pypi.python.org/pypi
username: brad
password: <pass>

[internal]
repository: http://localhost:8080
username: brad
password: <pass>

Создайте несколько псевдонимов оболочки (поместите эти определения в rc-файл вашей оболочки, например, ~/.bashrc):

alias ppup_internal='python setup.py bdist_egg sdist upload -r internal'
alias ppup_public='python setup.py bdist_egg sdist upload'

Использование:

% ppup_internal
...
running upload
Submitting dist/foo-0.0.0.tar.gz to http://localhost:8080
Server response (200): OK

Вариант 2. Взлом: вы можете обойти значение по умолчанию, изменив имя репозитория по умолчанию в верхней части ваших сценариев setup.py.

from distutils import config
config.PyPIRCCommand.DEFAULT_REPOSITORY = 'internal'
from setuptools import setup

setup(
    name='foo',
    ...

Выход:

% python setup.py sdist upload 
...
running upload
Submitting dist/foo-0.0.0.tar.gz to http://localhost:8080
Server response (200): OK

% python setup.py sdist upload -r pypi
...
running upload
Submitting dist/foo-0.0.0.tar.gz to http://pypi.python.org/pypi
Server response (200): OK

Предыстория: если вы определяете ключ [distutils] в .pypirc, команда загрузки по умолчанию использует URL-адрес pypi. когда аргумент -r [repo] опущен. Соответствующий код находится в distutils.config.PyPIRCCommand:

class PyPIRCCommand(Command):

    DEFAULT_REPOSITORY = 'http://pypi.python.org/pypi'

    def _read_pypirc(self):
        if os.path.exists(rc):
            self.announce('Using PyPI login from %s' % rc)
            repository = self.repository or self.DEFAULT_REPOSITORY
            realm = self.realm or self.DEFAULT_REALM

Старый формат .pypirc предполагал наличие раздела [server-login], который был гораздо менее гибким, поскольку определял только один целевой репозиторий. Это неприемлемый вариант, так как раздел [pypi] ниже будет непригоден для использования:

[server-login]
repository: http://localhost:8080
username: brad
password: <pass>

[pypi]
repository: http://pypi.python.org/pypi
username: brad
password: <pass>

Теперь по умолчанию distutils будет использовать эту цель:

% python setup.py sdist upload
...
running upload
Submitting dist/foo-0.0.0.tar.gz to http://localhost:8080
Server response (200): OK    

Но вы не можете получить доступ к любым другим репозиториям: по умолчанию он автоматически использует свойства [server-login]:

% python setup.py sdist upload -r pypi
...
running upload
Submitting dist/foo-0.0.0.tar.gz to http://localhost:8080
Server response (200): OK    
person samplebias    schedule 01.04.2011
comment
Спасибо, что прошли лишнюю милю в этом вопросе. Очень жаль, что не поддерживается. config.PyPIRCCommand.DEFAULT_REPOSITORY = 'internal' немного сбивает с толку, относится ли он к разделу в .pypirc или это URL-адрес сервера? - person bradley.ayers; 02.04.2011
comment
Да, я подумал, что лучше всего выложить все варианты, которые я мог найти. Строка internal — это имя раздела в .pypirc, который вы хотите использовать по умолчанию. Таким образом, в вашем .pypirc вы назвали свой локальный репозиторий [internal], чтобы эта строка в setup.py исправила по умолчанию значение internal. - person samplebias; 02.04.2011
comment
ой, я не знал, что должен был присуждать награду отдельно, вот и все. - person bradley.ayers; 05.04.2011

Аналогичная проблема возникает, когда вы хотите иметь внутренний репозиторий пакетов PyPI для установки. В этом сценарии использование pip install -e . вместо python setup.py develop полностью решает эту проблему. См. раздел Могу ли я использовать `pip` вместо `easy_install` для разрешения зависимостей `python setup.py install`?

person bradley.ayers    schedule 03.10.2011