倒退你的问题;虽然它确实很广泛,但主题仍然足够有限。
我可以告诉你,分类器不是被操纵的,而是从 中读取然后写入PKG-INFO
文件由egg_info
命令,依次查找所有egg_info.writers
入口点setuptools.command.egg_info:write_pkg_info https://github.com/pypa/setuptools/blob/master/setuptools/command/egg_info.py#L394函数将进行实际的写入。据我所知,尝试在外部利用该分类器并不是一个好方法,但是您可以覆盖一切 and anything你想要通过setuptools
这样你就可以自己制作write_pkg_info
函数,弄清楚如何读取元数据 https://docs.python.org/3/distutils/examples.html#reading-the-metadata(你可以在主窗口中看到distutils.command.upload:upload.upload_file https://github.com/python/cpython/blob/master/Lib/distutils/command/upload.py#L116方法)并在 upload_file 最终读取它之前进一步操作它。此时,您可能会认为操纵和使用这个系统会相当烦人。
正如我所提到的,一切都可以被覆盖。您可以创建一个带有公共标志的上传命令,如下所示:
from distutils.log import warn
from distutils.command.upload import upload as orig
# alternatively, for later versions of setuptools:
# from setuptools.command.upload import upload as orig
class upload(orig):
description = "customized upload command"
user_options = orig.user_options + [
('public', None,
'make package public on pypi'),
]
def initialize_options(self):
orig.initialize_options(self)
self.public = False
def run(self):
if not self.public:
warn('not public, not uploading')
return
return orig.run(self)
陪同的setup.py
可能看起来像这样。
from setuptools import setup
setup(
name='my_pypi_uploader',
version='0.0',
description='"safer" pypi uploader',
py_modules=['my_pypi_uploader'], # assuming above file is my_py_uploader.py
entry_points={
'distutils.commands': [
'upload = my_pypi_uploader:upload',
],
},
)
将其作为包安装到您的环境中,上传命令将替换为您的版本。运行示例:
$ python setup.py upload
running upload
not public, not uploading
使用公共标志重试
$ python setup.py upload --public
running upload
error: No dist file created in earlier command
这很好,因为我根本没有创建任何 dist 文件。您当然可以通过重写来进一步扩展该命令upload_file https://github.com/python/cpython/blob/master/Lib/distutils/command/upload.py#L116方法(在代码中复制)并更改部分以在子类中执行您想要的操作(例如在那里注入私有分类器),由您决定。
您可能还想知道为什么类名是小写的(违反 pep8),这是由于遗留问题以及给定命令的帮助是如何生成的。
$ python setup.py upload --help
...
Options for 'upload' command:
使用“正确”命名的类(例如SafeUpload
;记得还要更新entry_point
in the setup.py
指向这个新的类名)
$ python setup.py upload --help
...
Options for 'SafeUpload' command:
当然,如果此输出是意图,则可以使用标准类命名约定。
尽管说实话,您根本不应该在生产中指定上传,而应该在构建服务器上作为后推送挂钩的一部分执行此操作,因此当项目被推送(或标记)时,构建已完成并且文件被加载到您的私人服务器上,然后只有进一步的手动干预(或者如果推送特定标签则自动干预)才能将包上传到 pypi。但是,上面的示例应该可以帮助您开始执行最初打算做的事情。
最后一件事:你can只是改变self.repository
到您的私人 devpi 位置,如果--public
标志未设置。您可以在调用之前覆盖它orig.upload_file
方法(通过您的定制版本),或者在run
;因此,您的代码可以验证存储库 url 不是公共 PyPI 实例,而不是退出。或者,通过操作分布元数据(即分类器)self.distribution.metadata
(self
是upload
实例)。您当然可以创建一个全新的命令来玩这个您喜欢的内容(通过创建一个新的Command
子类,并为其添加一个新的入口点)。