Как избежать строительства нового колеса, если ничего не изменилось - PullRequest
0 голосов
/ 24 января 2020

Я создаю колеса для чистого Python проекта. Проект должен быть запущен в контейнере Docker, который проходит несколько сложных процессов сборки после копирования колеса в него. Я хотел бы воспользоваться кешем сборки Docker, но для этого мне нужно убедиться, что контрольная сумма файла встроенного колеса не изменится без необходимости.

Колеса основаны на zip, который означает, что при изменении некоторых видов метаданных во включаемых файлах изменяется сам zip-файл (и, следовательно, колесо). Но я не хочу, чтобы подобные изменения влияли на контрольную сумму файлов в колесе. Я только хочу, чтобы изменения в исходном коде проекта вызвали перестройку.

Я продумал некоторые довольно сложные решения этой проблемы, такие как ручное ведение записи отдельных контрольных сумм файлов, перечисленных в myproject.egg-info / SOURCES.txt, но есть ли более простой способ предотвратить изменение колеса, если ни один из источников существенно не изменился? (Например, есть ли способ запросить setuptools или egg-info, чтобы узнать, изменит ли что-нибудь пересбор?)

1 Ответ

0 голосов
/ 24 января 2020

Если сборка Docker также создает колесо, то входные файлы будут теми, чье значение имеет sh.

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/).

...