我编写了一些Python脚本,并在顶部嵌入了一些元数据,即:
__version__ = '0.6.1'
有人贡献了一个 setup.py,主要只是从脚本中复制元数据,所以我们有:
setup(
(...)
version='0.4.0',
我非常不喜欢这种重复,原因上面应该很明显了。更新元数据是由人们完成的,并不是所有人都知道/记得它需要在两个地方进行更新。错误是必然会发生的。不要忘记这样一个事实,即仅更新一个位置的版本号也更容易。我试图通过从代码本身中删除元数据来消除重复元数据,但是......它实际上是在脚本中引用的(它是一个脚本,毕竟它接受 --version 和 --help )。在脚本中嵌入此类元数据也被认为是“最佳实践”。
我当然可以做一些技巧来让 setup.py 从脚本中读取元数据。事实上,我花的时间可能比写这个问题要少——我更想知道什么是“最佳实践”。在 setup.py 和库/脚本中复制这些信息真的被认为是“最佳实践”吗?是否存在一些现成的食谱样板代码用于从脚本/包本身读取元数据?如果设置方法可以自己完成此操作,那不是很有意义吗?
您可以导入包并从那里获取元数据。
这确实假设您的文件结构如下所示:
root/
code.py
setup.py
或者
root/
code/
__init__.py
setup.py
并且
code.py
或 __init__.py
具有元数据。
import os
import sys
__dir__ = path.abspath(path.dirname(__file__)) # The directory of setup.py, root/
sys.path.insert(0, __dir__) # Will search __dir__ first for the package
try:
import code
finally:
sys.path.pop(0)
setup_args = dict(
name='code',
# ...
)
for metadata in ('version', 'author', 'email', 'license'):
if hasattr(code, '__{}__'.format(metadata)):
setup_args[metadata] = getattr(code, '__{}__'.format(metadata))
setup(**setup_args)
更新 2024:我现在使用 setuptools-scm - 它会根据给定的 git 标签自动设置版本。 这是一个提交
经过一番研究后,我会回答自己......
首先 - 显然不存在任何在脚本或库本身中嵌入元数据的约定 - 我只能猜测这是我自己的发明,将
__author__
、__license__
等添加到脚本中。
ATOH,存在将
__version__
添加到脚本和库的约定。 PEP 8 描述了应该在每次提交时自动将其设置为 VCS 修订号 - 尽管它通常设置为符号版本号。 PEP 396 试图解决这个问题,但由于缺乏兴趣或时间而被推迟。
因此,当
__version__
中有符号版本号并且还为项目提供 setup.py
时,人们要么需要在两个地方更新版本号,要么需要采取一些技巧来使其在一个地方自动更新(或者可能让 VCS 自动更新这两个位置)。
就我自己而言,我最终将脚本导入到 setup.py 中并从那里读取
__version__
-
https://github.com/tobixen/calendar-cli/commit/854948ddc057f0ce7cc047b3618e8d5f6a1a292c