Автообновление Homebrew

13

В настоящее время я использую менеджер пакетов Homebrew, и мой вопрос: возможно ли написать сценарий bash для выполнения brew updateи, в конечном итоге, brew upgradeпри первом открытии оболочки? Я использую iTerm в данный момент.

g_rmz
источник
Вы можете сделать это в ~/.bash_profileфайле. Вам нужно будет проверить, открыт ли только 1 сеанс терминала, а затем запустить brew update. Проверьте stackoverflow.com/questions/6172663/… для определения количества окон терминала.
Матеуш Шлосек
Это количество терминалов, открытых при выполнении скрипта, или количество терминалов, открытых в целом?
g_rmz
Это количество открытых терминалов (окон + вкладок) при запуске скрипта. ~/.bash_profileавтоматически выполняется в начале сеанса терминала. Эта проверка необходима, если вам нужно запустить brew updateпри первом запуске. Если Вы хотите запустить это каждый раз , когда открывается новое окно, пропустите этот шаг и запустить brew updateв ~/.bash_profile.
Матеуш Шлосек
Это сделает открытие вкладки «Терминал» очень медленным
user151019
Хорошо спасибо! :) Это очень сильно снизит производительность терминала?
g_rmz 19.09.15

Ответы:

20

Это очень легко сделать.

Для эффективности (и крутого фактора) я бы использовал такой инструмент, как Lingon, чтобы периодически запускать этот скрипт, используя launchctl / launchd, вместо того, чтобы каждый раз запускать оболочку. На моем MacBook требуется 3 секунды для обновления во второй раз (без работы, DNS-кэша и т. Д.) И для запуска в первый раз (без работы) требуется 10 секунд или более 15 секунд, если требуется пакет быть загруженным или скомпилированным.

Возможно, один раз в день или один раз в час - выполнение в фоновом режиме будет достаточно для выполнения этих времен?

Вы можете сделать простой скрипт, /usr/local/bin/brewupкоторый вызывает brew по очереди и записывает результаты в системный журнал

#!/bin/bash

brew=/usr/local/bin/brew
logger=/usr/bin/logger

$brew update 2>&1  | $logger -t brewup.update
$brew upgrade 2>&1 | $logger -t brewup.upgrade
$brew cleanup 2>&1 | $logger -t brewup.cleanup

Я просто звоню в кафе, когда собираюсь приготовить чай или когда я начинаю, и позволяю ему работать в фоновом режиме.

brewup &
bmike
источник
2
+1 Я согласен, что лучше использовать тот тип launchclt, а не запускаться при каждом запуске Терминала. Кроме того, он не зависит от терминала (для пользователей iTerm).
Матеуш Шлосек
1
Это великолепно, спасибо! :) Как насчет crontab вместо Lingon?
g_rmz 19.09.15
2
@ g_rmz В crontab нет ничего плохого, и это легко узнать. Если это работает, бегите с этим. Преимущество этого метода launchdв cronтом, что он более устойчивый, более энергосберегающий и более естественно обрабатывает интервалы сна / пропущенного времени.
bmike
Спасибо за отличный сценарий. Просто из любопытства - какой вариант -t?
Авриис
1
Привет @ Dahved. Смотрите справочную страницу для logger для сухой версии tфлага. Я использую его, чтобы найти эти сообщения в море журналов с помощью простого слова grepили logкоманды и предиката / поискового запроса.
bmike
5

Существует инструмент под названием homebrew-autoupdate, который сделает это за вас. Он может автоматически запускаться brew updateв фоновом режиме каждые 24 часа (настраивается), чтобы всегда иметь свежие доморощенные данные при переходе к установке / обновлению пакетов.

Для его установки запустите brew tap domt4/autoupdateи brew autoupdate --start 43200настройте автообновление каждые 12 часов (43200 секунд).

Даниэль Комптон
источник
0

Я предпочитаю обновлять Homebrew при запуске. У меня есть скрипт Update Homebrew.shв ~/Library/Scripts:

#!/usr/local/bin/bash

for cmd in update upgrade cleanup\ -s; do
  brew $cmd
done

Этот скрипт запускается при запуске с помощью launchd. Для этого я имею Update Homebrew.plistв ~/Library/LaunchAgents:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>Label</key>
        <string>Update Homebrew</string>
        <key>ProgramArguments</key>
        <array>
            <string>/Users/Daan/Library/Scripts/Update Homebrew.sh</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
    </dict>
</plist>

Обратите внимание, что он может не обновляться надежно, если у вас есть, скажем, MacBook, и вы открываете и закрываете только крышку. Тем не менее, это хорошо работает для моего iMac, который я регулярно выключаю и запускаю. Дайте мне знать, если это работает!

Даан
источник