〜/ .pypirc中distutils的多服务器配置中的默认服务器

时间:2011-03-29 03:04:25

标签: python distutils pypi

我希望在~/.pypirc文件中有多个PyPI服务器,这样我就可以轻松地发布到不同的服务器,具体取决于项目。

我的用例是这样的,我有一些内部项目要发布到内部PyPI服务器(https://pypi.internal),我有一些公共项目要发布到公共PyPI。< / p>

这是我目前的尝试,但它不起作用。我想默认为internal,如果我想要发布到公共服务器,则需要添加-r pypi(到setup.py命令)。

[distutils]
index-servers =
    internal
    pypi

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

[pypi]
username: brad

我哪里错了?

2 个答案:

答案 0 :(得分:13)

奇怪的是,没有内置支持来设置默认值,但这里有两个选项可以帮助您解决它。

选项1:可能最简单的解决方案是保持〜/ .pypirc 脚本不变,并为内部和公共上传创建shell别名。这可以让您更好地控制工作流程的自定义内容。

鉴于此 .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>

创建一些shell别名(将这些定义放在shell的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

背景:如果您在 .pypirc 中定义 [distutils] 键,则upload命令默认为 pypi url < / strong>省略 -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    

答案 1 :(得分:0)

类似的问题是当您想要安装内部PyPI包存储库时。在此方案中,使用pip install -e .而不是python setup.py develop完全支持此问题。见Can I use `pip` instead of `easy_install` for `python setup.py install` dependency resolution?