在Pypi上注册内部包

Dan*_*Dan 10 python package pypi python-3.x

我在某处读到,如果您为专有工作制作内部Python包,您仍应在PyPi上注册该名称,以避免潜在的未来依赖性问题.

如果不公开发布我的代码,我该怎么做?该软件包包含在我的工作内部使用的代码.我应该使用我想要保留的名称创建一个空的python包并将其上传到PyPi吗?然后使用git而不是PyPi在工作中安装我的包?

上传一个空包似乎是一件愚蠢的事情,这会让其他人烦恼.但我找不到一种方法来注册这个名字.

hoe*_*ing 9

由于register不建议使用该命令,并且不再支持该命令,因此您必须执行以下步骤:

  1. 创建setup.py带有空软件包列表,初始版本和填写的元数据的存根
  2. 构建并上传软件包
  3. 转到PyPI并删除刚上传的初始软件包版本

这样,软件包名称将保留给您,因为您现在已经注册为它的所有者,但是搜索该软件包将不会产生任何结果,并且任何直接访问都将产生404。

假设您要保留软件包名称foo。脚步:

  1. 创建一个新的setup.py存根。确保packages列表为空,以免意外上传一些代码:

    from setuptools import setup
    
    setup(
        name='foo',
        version='0.0.1',
        description='',
        long_description='',
        url='https://www.example.com',
        author='me',
        author_email='me@example.com',
        packages=[],
        classifiers=['Development Status :: 1 - Planning'],
    )
    
    Run Code Online (Sandbox Code Playgroud)
  2. 构建并上传软件包:

    $ python setup.py bdist_wheel upload
    running bdist_wheel
    running build
    ...
    running upload
    Submitting /tmp/foo/dist/foo-0.0.1-py3-none-any.whl to https://upload.pypi.org/legacy/
    Server response (200): OK
    
    Run Code Online (Sandbox Code Playgroud)
  3. 删除已上传的车轮:转到项目页面https://pypi.python.org/pypi?%3Aaction=pkg_edit&name=foo,您将在其中找到已上传的车轮列表-选择一个已上传的车轮并按Remove

现在,您已经保留了项目名称,因为foo除非您授予他们对PyPI的管理员权限,否则其他人将无法上载软件包:

$ python setup.py bdist_wheel upload
running bdist_wheel
running build
...
running upload
Submitting /tmp/foo/dist/foo-0.0.2-py3-none-any.whl to https://upload.pypi.org/legacy/
Upload failed (403): The user 'bar' is not allowed to upload to project 'foo'. See https://pypi.org/help#project-name for more information.
error: Upload failed (403): The user 'bar' is not allowed to upload to project 'foo'. See https://pypi.org/help#project-name for more information.

$ twine upload dist/foo-0.0.2-py3-none-any.whl 
Uploading distributions to https://upload.pypi.org/legacy/
Uploading foo-0.0.2-py3-none-any.whl
HTTPError: 403 Client Error: The user 'bar' is not allowed to 
upload to project 'foo'. See https://pypi.org/help#project-name for 
more information. for url: https://upload.pypi.org/legacy/
Run Code Online (Sandbox Code Playgroud)

任何直接访问尝试都将以404结尾:

$ curl -I https://pypi.python.org/pypi/foo
HTTP/2 404
Run Code Online (Sandbox Code Playgroud)

通过via安装pip将按预期失败:

$ pip install foo
Collecting foo
  Could not find a version that satisfies the requirement foo (from versions: )
No matching distribution found for foo
Run Code Online (Sandbox Code Playgroud)

PEP 541

请注意,有一个PEP 541的草稿,它定义了程序包索引上无法访问,被放弃和无效的项目。在活动项目的名称冲突解决部分中,它指出:

以下条件均不符合包名称所有权转移的条件:

...

用户A在包索引之外拥有一个项目X。用户B在索引上以名称X创建一个包。一段时间后,用户A想要在索引上发布项目X,但意识到名称已被使用。即使用户A的项目X获得了知名度,而用户B的项目X没有受到关注,这也是正确的。

因此,尽管PEP确认没有人可以从您那里取走一个活动项目的名称,但是在非活动项目的情况下不能保证这是对付域名抢注的一个很好的对策。我的理解是,如果您现在保留一个名称而不进行任何开发,并且将来某个开源项目以该名称出现并且非常受欢迎,那么您可以肯定,项目所有者的权利将被您夺走。

另请注意,如果PEP 541获得批准,则空包装或无功能的包装将被视为无效包装,并将被移除:

在Package Index上满足以下任何条件的项目均被视为无效,并将被从Index中删除:

...

  • 项目是域名抢注(程序包无功能或为空);

  • 项目名称,描述或内容违反行为准则;要么

  • 专案是出于非预期目的滥用套件索引。

  • 您不会听到我经常这样说,但是对我来说,这是Java的打包命名约定在Python的带动下发展的领域。我希望我可以命名为“ net.mydomain.whatever”并完成它,即使“ net.mydomain”只是命名空间包。只是我的$ 0.02。 (2认同)