如果什么都没有改变,如何避免造一个新轮子

How to avoid buiding a new wheel if nothing has changed

我正在为一个纯粹的 Python 项目造轮子。该项目需要 运行 在一个 Docker 容器中,在将轮子复制到其中后会经历一些繁重的构建过程。我想利用 Docker 构建缓存,但为了做到这一点,我需要确保构建的 wheel 文件的校验和不会发生不必要的更改。

wheels 基于 zip,这意味着当所包含文件中的某些元数据发生变化时,zip 文件本身(以及 wheel)也会发生变化。但我不希望这些类型的更改影响 wheel 中文件的校验和。我只想更改项目的实际源代码以引起重建。

我想出了一些相当复杂的解决方案来解决这个问题,例如手动记录 myproject.egg-info/SOURCES.txt 中列出的文件的各个校验和,但是有没有更简单的方法来防止如果源的 none 发生了显着变化,轮子将不会发生变化? (例如,有没有办法查询 setuptools 或 egg-info 来判断重建是否会改变任何东西?)

如果 Docker 构建也构建了轮子,那么输入文件将是其哈希重要的文件。

FROM python
COPY . .  # this is where cache invalidation will happen
RUN python setup.py bdist_wheel
# ... now do the rest of the build steps

如果您希望最终 Docker 图像不包含构建轮子所需的所有基础结构和文件,您也可以将其作为多阶段构建来执行 (https://pythonspeed.com/articles/smaller-python-docker-images/)。