Ответ 1
Здесь есть 3 отдельные, слабо связанные проблемы:
- Кеш скачал бутылки
- Кэш-бутылки локального производства
- Cache Homebrew метаданные
Вам не обязательно все три, так что следуйте тем разделам, которые соответствуют вашим потребностям.
Кеш скачал бутылки
-
Добавьте
$HOME/Library/Caches/Homebrew
в кэш Travis (на самом деле этот путь должен бытьbrew --cache
с помощьюbrew --cache
но вы не можете вызвать его здесь, не так ли)cache: directories: - $HOME/Library/Caches/Homebrew
-
Запустите
brew cleanup
на этапеbefore_cache
- в противном случае кэш будет расти бесконечно, по мере выпуска новых версий пакетов.before_cache: - brew cleanup
Кэш-бутылки локального производства
Полный код слишком длинный, чтобы перечислять его здесь, поэтому приведем алгоритм.
Это в дополнение к предыдущему разделу. При использовании без него сохраняйте локальные флаконы где-нибудь за пределами кэша Homebrew на этапе установки и добавляйте их в кэш под соответствующими именами на этапе запуска ниже.
-
При установке:
- Проверяйте зависимости пакетов с помощью
brew deps
рекурсивно- Если бутылка для пакета недоступна для вашей среды (нет
(bottled)
в выводеbrew info <pkg>
), включите зависимости для сборки с помощью--include-build
- Если бутылка для пакета недоступна для вашей среды (нет
-
Для каждого из пакетов и зависимостей,
- Если он уже установлен (
brew list --versions <pkg>
успешно) и последняя версия (отсутствует вbrew outdated
), пропустите его - Если имеется более старая версия, на следующих этапах вам необходимо установить новую версию вместе со старой:
-
brew unlink
старую версию, если она не только для бочонка (нет[keg-only]
в выводеbrew info
) - Вызвать всю
brew install
с--force
-
- Если бутылка доступна, просто
brew install
ее -
Если бутылка недоступна,
-
Постройте и установите его в следующей последовательности:
brew install --build-bottle <pkg> brew bottle --json <pkg> brew uninstall --ignore-dependencies <pkg> brew install <bottle>
(Кажется, нет никакого официального способа получить имена полученной бутылки и файла JSON. Я взял имя бутылки из вывода
brew bottle
и вывел из него имя файла JSON.) -
Добавьте информацию о бутылке в формулу упаковки
brew bottle --merge --write <json file>
-
Сохраните файл бутылки в кэш Travis под соответствующим именем, заданным
brew --cache <pkg>
- Делайте это только после добавления информации о бутылке - в противном случае вы получите путь к исходному пакету.
- (Homebrew также создает символические ссылки на загруженные файлы в
$HOME/Library/Caches/Homebrew
. Вам не нужно этого делать.)
- Сохраните файл JSON для дальнейшего использования. Не забудьте добавить его местоположение в кэш Travis.
-
- Если он уже установлен (
- Проверяйте зависимости пакетов с помощью
-
При запуске:
- Сделайте
brew update
если вы собираетесь - Просмотрите сохраненные файлы .json. Для каждого из них проверьте, подходит ли локальная бутылка (сравнивая версии и номера перестроений; вы можете проанализировать выходные
brew info --json=v1 <pkg>
иbrew info --json=v1 <bottle>
для этих данных.).- Удалите кэшированную бутылку и .json, если нет
- Поскольку в этот момент вы не сможете найти путь к бутылке с
brew --cache
, вам необходимо сохранить его самостоятельно.Символьные ссылки не сохраняются в кэше Трэвиса на момент написания этой статьи, поэтому я использовал обычные файлы с путями.
- Поскольку в этот момент вы не сможете найти путь к бутылке с
- Повторно добавьте информацию о бутылке в формулу, как указано выше, если да
- Также маловероятно, что они изменят URL-адрес загрузки в формуле без изменения версии - тогда ожидаемое кэшированное имя бутылки изменится, поскольку хэш в нем является хешем URL-адреса загрузки.Чтобы учесть это, проверьте,
brew --cache <pkg>
лиbrew --cache <pkg>
на вашу бутылку после добавления информации.
- Также маловероятно, что они изменят URL-адрес загрузки в формуле без изменения версии - тогда ожидаемое кэшированное имя бутылки изменится, поскольку хэш в нем является хешем URL-адреса загрузки.Чтобы учесть это, проверьте,
- Удалите кэшированную бутылку и .json, если нет
- Сделайте
-
На
before_cache
:- Если вы используете
brew cleanup
из предыдущего раздела, сохраните локально созданные файлы бутылок из кэша, прежде чем запускать его, потому чтоcleanup
может удалить те, которые не были нужны в этот раз. Послеcleanup
восстановите те, которые были удалены.
- Если вы используете
Cache Homebrew метаданные
(Опять же, полный код слишком длинный, поэтому приведем алгоритм.)
Если вы запустите brew update --verbose
(и убедитесь, что в .travis.yml
или в настройках проекта Travis нет секретных переменных - brew
печатает много сообщений о состоянии, только если stdout
является tty) - вы увидите, что именно составляет Самостоятельная операция Homebrew - то, что вы должны кешировать:
- Вытягивание (фактически,
rebase
по умолчанию) в несколько путей, которые на самом деле являются репозиториямиgit
:-
/usr/local/Homebrew
- сам доморощенный -
/usr/local/Homebrew/Library/Taps/*/*
- установленные taps
-
- Проходя через краны и кеш и перенося устаревшие биты. Поскольку содержимое кэша Travis добавляется в существующую структуру каталогов, а не заменяет ее, во второй раз могут возникать странные действия и ошибки, вызванные файлами, которые были удалены как часть обновления, но снова присутствуют в новой виртуальной машине. Те, которые я засвидетельствовал:
- всегда будет пытаться перенести
Taps/caskroom/homebrew-cask
наTaps/homebrew/homebrew-cask
, создав копию вTaps/homebrew/homebrew-cask/homebrew-cask
.В случае кэширования эта копия вызовет сообщение "ошибка: файл существует" при следующем запуске. - всегда будет пытаться импортировать множество не зафиксированных файлов в
Taps/homebrew/homebrew-versions
- всегда будет пытаться перенести
Итак, действия будут:
-
Добавьте
/usr/local/Homebrew
в кэш Travis- добавление /usr/local/Cellar и /usr/local/opt оказалось плохой идеей: во-первых, они слишком велики, что приводит к превышению времени ожидания при создании и загрузке кэша; во-вторых, это небезопасно,
postinstall
сценарии после установки могут влиять на другие произвольные части системы, поэтому каждый раз следует устанавливать новые версии пакетов из (кэшированных) бутылок, а не кэшировать результат. В любом случае установка бутылки занимает всего несколько секунд.
- добавление /usr/local/Cellar и /usr/local/opt оказалось плохой идеей: во-первых, они слишком велики, что приводит к превышению времени ожидания при создании и загрузке кэша; во-вторых, это небезопасно,
-
Перед
brew update
: очистите базу кодов Homebrew- Удалите
Taps/caskroom/homebrew-cask
если существуетTaps/homebrew/homebrew-cask
- Найти все
git
репо под/usr/local/Homebrew
(find -type d -name.git
, получитьdirname
результата) и запуститьgit clean -fxd
в каждом, чтобы избавиться от остатков Трэвиса - Очистите кэш Homebrew от остатков также с помощью
brew cleanup
(если вы используете его в сочетании с предыдущим разделом, см. Там о дополнительных операциях) - в противном случае вы получите много ошибок приbrew update
в разделе "Перенос записей кэша".." этап.
- Удалите
-
При
brew update
:-
brew update --merge
этого используйтеbrew update --merge
- он автоматически разрешит любые возможные конфликты с вашими локальными коммитами с информацией о бутылке
-
-
При повторном добавлении локальных бутылок (при использовании в сочетании с предыдущим разделом):
- Не добавляйте информацию о бутылке в формулу, если она там уже есть
- Если версия пакета изменилась и информация о вашей бутылке присутствует в формуле, удалите ее из формулы и
git commit
. Нет стандартного способа сделать это, поэтому вам придется проанализировать и отредактировать файл формулы с помощью скрипта и удалить соответствующую строку из таблицыbottle do
. Путь к файлу формул определяется формулойbrew formula <pkg>
.
-
При установке:
-
При использовании сторонних метчиков всегда проверяйте, установлен ли этот тап:
brew tap | grep -qxF <tap> || brew tap <tap>
-
Поскольку символические ссылки не сохраняются в кэше Travis, контакты, скорее всего, не будут запомнены. Но проверять их тоже не повредит:
brew tap --list-pinned | grep -qxF <tap> || brew tap-pin <tap>
-
-
-
На
before_cache
:- Удалите
Taps/homebrew/homebrew-cask/homebrew-cask
если он существует
- Удалите