【问题标题】:How could I add an md5 file to the tarball sdist creates?如何将 md5 文件添加到 tarball sdist 创建?
【发布时间】:2023-11-25 22:08:01
【问题描述】:

我想创建一个新命令作为我的 setup.py 文件 (python setup.py manifest) 的一部分,或者扩展 sdist 命令本身。

对于我正在做的发行版,进入sdist 创建的压缩包的“构建”文件结果是静态的。与已安装的模块一起分发的 md5 摘要文件将是检查模块的便捷方法。

他们的命名空间元素是否在 sdist 对象中,例如进入 tarball 的文件列表,或者可以帮助我解决此问题的 tarball 名称?

这是我认为可能有意义的事情:

from setuptools import setup, find_packages, Command
from distutils.command.sdist import sdist

 ...

class my_sdist(sdist):
    # Get file list for the tarball
    flist = sdist. ???
    # Do the MD5
    os.system( ... )
    # Add the new MD5 File to the list
    sdist. ??? = flist + new file

    return sdist.run(self)

 ...

setup( ... , cmdclass = { 'sdist' : my_sdist }, ... )

【问题讨论】:

  • "有一个 md5 摘要文件与已安装的模块一起分发" — sdists 不是 Python 包的 已安装 格式。使用任何相当新的 pip 版本安装的软件包都将安装为*(如果没有*可用,则从 sdist 构建),其中包含列出*中所有其他文件的 SHA 256 哈希的RECORD 文件。
  • @jwodder 不幸的是,在我弄清楚如何(读作“被打扰”)处理必须安装在/etc/{init.d,logrotate.d,cron.hourly} 中的配置文件之前,我坚持使用非轮式分发(使用--no-binary 选项)。也就是说,RECORD 文件(用于安装*)是否已安装?
  • 是的,RECORD 文件与其他*元数据一起放置在已安装 Python 代码旁边的 *.dist-info 目录中。

标签: python setuptools


【解决方案1】:

setup.py sdist(可能通过make)之前创建您的md5 校验和文件,然后将它包含在MANIFEST.in 中怎么样?

MANIFEST.in:

include README.rst LICENSE ... CHECKSUM

Makefile

checksum:
    find . -name CHECKSUM -prune -o -type f -exec md5sum '{}' >CHECKSUM \;

package: checksum
    python setup.py sdist

用法

$ make package

递归地计算. 中所有文件的md5 校验和(文件CHECKSUM 除外)并更新CHECKSUM 文件。然后,它会调用setup.py sdist,它将在包中包含更新的校验和文件。

【讨论】:

  • 是的......但是从项目到项目,用于生成 CHECKSUM 文件的文件列表可能会有所不同。我可以使用文件列表代替find . -name ... 命令,但我会维护两个文件列表:一个用于Makefile,另一个用于setuptools。我想我真的宁愿把它放在setup.py
  • 我明白了。您可以仅计算包中包含的文件 (tar.gz) 的校验和,打包后,然后将其添加到该包中;或仅包含暂存目录中文件的校验和;或者甚至只使用来自git ls-files...的文件...
  • 我想你明白为什么我希望按照我现在建议的方式去做。如果我只依赖与 git (git ls-files) 相关的事情,那么 git 哈希就足够了。