4

我想在我的~/.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

我哪里错了?

4

2 回答 2

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: hack:您可以通过在 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]键,则在省略-r [repo]参数时,上传命令默认为pypi url 。相关代码在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    
于 2011-04-01T19:54:38.260 回答
0

一个类似的问题是当你想要一个内部的 PyPI 包存储库来安装时。在这种情况下,使用pip install -e .而不是python setup.py develop完全回避这个问题。请参阅Can I use `pip` instead of `easy_install` for `python setup.py install` 依赖解析?

于 2011-10-03T04:06:12.667 回答