setup.py 的设计模式以避免重复的元数据

问题描述 投票:0回答:2

我编写了一些Python脚本,并在顶部嵌入了一些元数据,即:

__version__ = '0.6.1'

有人贡献了一个 setup.py,主要只是从脚本中复制元数据,所以我们有:

setup(
    (...)
    version='0.4.0',

我非常不喜欢这种重复,原因上面应该很明显了。更新元数据是由人们完成的,并不是所有人都知道/记得它需要在两个地方进行更新。错误是必然会发生的。不要忘记这样一个事实,即仅更新一个位置的版本号也更容易。我试图通过从代码本身中删除元数据来消除重复元数据,但是......它实际上是在脚本中引用的(它是一个脚本,毕竟它接受 --version 和 --help )。在脚本中嵌入此类元数据也被认为是“最佳实践”。

我当然可以做一些技巧来让 setup.py 从脚本中读取元数据。事实上,我花的时间可能比写这个问题要少——我更想知道什么是“最佳实践”。在 setup.py 和库/脚本中复制这些信息真的被认为是“最佳实践”吗?是否存在一些现成的食谱样板代码用于从脚本/包本身读取元数据?如果设置方法可以自己完成此操作,那不是很有意义吗?

python easy-install
2个回答
1
投票

您可以导入包并从那里获取元数据。

这确实假设您的文件结构如下所示:

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)

0
投票

更新 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

© www.soinside.com 2019 - 2024. All rights reserved.