Воспроизводимые сборки
Среда сборки Homebrew по возможности создаётся с учётом цели обеспечения воспроизводимых сборок. Авторы формул также могут воспользоваться некоторыми удобными инструментами, помогающими добиться детерминированных сборок.
Время сборки
Некоторые инструменты сборки встраивают или записывают время выполнения сборки. Это может привести к тому, что артефакты сборки будут различаться при повторных сборках одних и тех же исходных файлов. Чтобы избежать этой проблемы, среда сборки Homebrew задаёт SOURCE_DATE_EPOCH переменную окружения равной времени изменения исходного кода для инструментов, которые её используют.
Если время сборки необходимо задать вручную, time — это объект Ruby DateTime, содержащий ту же временную метку, что и переменная окружения SOURCE_DATE_EPOCH. Затем для форматирования этого времени в нужном формате можно использовать методы Ruby для объектов DateTime.
def install
system "make", "install",
"VERSION=#{version}",
"DATE=#{time.iso8601}",
"PREFIX=#{prefix}"
end В качестве примера использования time.iso8601 см. формулу kustomize, а в качестве примера использования time.strftime с пользовательскими спецификаторами формата — формулу git-town.
Воспроизводимое сжатие gzip
Некоторые формулы могут создавать файлы, сжатые с помощью gzip, в процессе сборки (например, сжимать страницы руководств или другие файлы данных). На машинах сборки могут быть доступны разные реализации утилиты gzip, а по умолчанию gzip записывает время изменения сжимаемого файла, которое обычно зависит от времени сборки. Поэтому использование утилиты gzip, доступной на машине сборки, обычно приводит к тому, что в сборку включаются невоспроизводимые результаты.
Чтобы избежать этой проблемы, Homebrew предоставляет вспомогательную функцию Utils::Gzip.compress для случаев, когда требуется воспроизводимое сжатие gzip. Эта функция принимает один или несколько путей к файлам для сжатия и помещает сжатые файлы рядом с исходными, добавляя суффикс .gz, как это делает утилита gzip. Она также возвращает массив объектов Pathname, которые можно использовать в других методах.
def install
system "make", "install"
man1.install Utils::Gzip.compress("mycommand.1")
end def install
system "make", "install"
(pkgshare/"data").install Utils::Gzip.compress(*Dir["#{buildpath}/path/to/some/folder/contents/*"])
end Пример работы с одним файлом см. в формуле par, а пример работы с несколькими файлами — в формуле pari-elldata.
Возможность перемещения
Некоторые формулы или инструменты сборки записывают в файлы конфигурации или двоичные файлы пути, специфичные для среды сборки. При создании распространяемых бутылок Homebrew ищет в собранных файлах пути к стандартным каталогам Homebrew, таким как префикс Homebrew и Cellar, и заменяет их заполнителями, например @@HOMEBREW_PREFIX@@ или @@HOMEBREW_CELLAR@@. При установке бутылок Homebrew подставляет вместо этих заполнителей соответствующие пути на компьютере конечного пользователя.
Благодаря этому некоторые бутылки могут использовать пользователи, у которых Homebrew установлен в нестандартном префиксе. Кроме того, это позволяет создавать побитно идентичные бутылки для платформ, различающихся только расположением Homebrew.
Этот процесс поиска и замены выполняется автоматически и не требует от авторов формул каких-либо дополнительных действий.
© 2009–present Homebrew contributors
Licensed under the BSD 2-Clause License.
https://docs.brew.sh/Reproducible-Builds