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

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

Мой вариант использования такой: у меня есть несколько внутренних проектов, которые я хочу опубликовать на внутреннем сервере 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

Куда я иду не так?

Ответы [ 2 ]

13 голосов
/ 01 апреля 2011

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

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

С учетом этого .pypirc file:

[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>

Создайте несколько псевдонимов оболочки (поместите эти определения в rcfile вашей оболочки, например, ~ / .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 , команда загрузки по умолчанию будет pypi url , когда аргумент -r [репо] опущен. Соответствующий код находится в 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    
0 голосов
/ 03 октября 2011

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

...