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

6 投票
2 回答
6170 浏览
提问于 2025-04-16 14:37

我想在我的 ~/.pypirc 文件里设置多个 PyPI 服务器,这样我就可以根据不同的项目,方便地发布到不同的服务器上。

我的需求是这样的:我有一些内部项目想要发布到一个内部的 PyPI 服务器(https://pypi.internal),还有一些公共项目想要发布到公共的 PyPI。

这是我目前的尝试,但没有成功。我希望默认发布到 internal,如果我想发布到公共服务器,就需要在 setup.py 命令中加上 -r pypi

[distutils]
index-servers =
    internal
    pypi

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

[pypi]
username: brad

我哪里做错了呢?

2 个回答

0

类似的问题是,当你想要有一个内部的PyPI包仓库来进行安装时。在这种情况下,使用 pip install -e . 而不是 python setup.py develop 可以完全避免这个问题。你可以查看这个链接了解更多信息:我可以用`pip`代替`easy_install`来解决`python setup.py install`的依赖问题吗?

15

奇怪的是,系统没有内置的设置默认值的支持,不过这里有两个方法可以帮助你解决这个问题。

方法一: 最简单的办法可能就是保持你的~/.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>

接下来,创建一些命令别名(把这些定义放在你的命令行配置文件里,比如~/.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

方法二: 这是一个小技巧:你可以通过在你的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    

撰写回答