## Homebrew 

[Homebrew](https://brew.sh/) — утилита [командной строки](/1%20Common/1.3%20Terminal/1.3.0%20Terminal.md) в macOS и Linux, устанавливает нужные вам пакеты, не предоставляемые Apple.

До Homebrew было несколько различных попыток создать эффективные пакетные менеджеры для OS X. Наиболее популярные: [Fink](https://finkproject.org/) и [Macports](https://www.macports.org/). У каждой из них есть свои проблемы. В обоих создание своих пакетов или портов является черезчур сложным.

[Homebrew](https://brew.sh/) основан на двух вещах: [Git](/1%20Common/1.2%20Git/1.2.2%20Git.md) и Ruby (`brew --prefix ruby`)



Дефолтное расположение `brew`: 
1) `/opt/homebrew` для Apple Silicon на [arm архитектур](/2%20ComputerScience/2.0%20Linux/2.0.2%20Processor(CPU).md); 
2) `/usr/local` for macOS для Intel [чипов на x86 архитектуре](/2%20ComputerScience/2.0%20Linux/2.0.2%20Processor(CPU).md);

| Термин | Описание | Пример |
|---|---|---|
| **Formula (Формула)** | Определение пакета (скрипт Ruby), включающее инструкции по установке, зависимости и конфигурации пакета | `/usr/local/Library/Formula/foo.rb` |
| **Keg (Бочонок)**  | Директория, в которую устанавливается конкретная версия пакета (Formula) | `/usr/local/Cellar/foo/0.1` или `/opt/homebrew/Cellar/foo/0.1`|
| **opt prefix (префикс)** | Символическая ссылка (симлинк) на активную версию пакета для упрощения доступа | `/usr/local/opt/foo` |
| **Cellar (Погреб)** | Основной каталог, где хранятся установленные версии всех пакетов | `/usr/local/Cellar` |
| **Tap (Кран)** | Дополнительный репозиторий, в котором хранятся уже собственные формулы | `/usr/local/Library/Taps/homebrew/homebrew-versions` |
| **Bottle (Бутылка)** | Предварительно собранная и упакованная версия пакета (Keg), готовая для установки. Благодаря Bottle(бутылкам) не нужно компилировать программы и Homebrew достаточно скачать готовые пакеты под целевую систему. | `qt-4.8.4.mavericks.bottle.tar.gz` |

## Установка homebrew без sudo

Может возникнуть потребность установки `brew` в отличную от дефолтной директории:

```bash
1) mkdir ~/homebrew 
2) скачать оттуда https://github.com/Homebrew/brew/tarball/master
3) (echo; echo 'eval "$(~/homebrew/bin/brew shellenv)"') >> ~/.zprofile 
4) eval "$(~/homebrew/bin/brew shellenv)"
5) ~/homebrew/bin/brew update --force --quiet 
6) chmod -R go-w "$(brew --prefix)" 
```

Профит, дальше можно устанавливать любые пакеты: `brew install cocoapods`

## Команды

### 1) Диагностика системы:

`brew doctor`

### 2) Обновление самого brew:

`brew update` - происходит git pull репозитория brew

### 3) Обновление пакетов:

`brew upgrade` or `brew upgrade <package>`

### 4) Устаревшие пакеты

`brew outdated`

### 5) После установки новых версий старые версии пакетов (**formula**) остаются на диске

Автоматически очищает устаревший кэш Homebrew и версии пакетов, включая файлы в ~/Library/Caches/Homebrew, которые больше не нужны:

`brew cleanup`

**Без** флага `--prune=all` с более щадящими настройками:

| Функция | brew cleanup | brew cleanup --prune=all |
|---|---|---|
| Удаление старых версий пакетов | Да, но только сильно устаревших | Удаляет все старые версии пакетов |
| Удаление временных файлов | Да, но только устаревших | Удаляет все временные файлы |
| Ограничение по времени | Есть (обычно файлы старше 30 дней) | Нет, удаляются все устаревшие файлы |

Чтобы увидеть, что будет удалено, фактически ничего не удаляя:

`brew cleanup --prune=all --dry-run`

### 6) Удаление "осиротевших" зависимостей

Удаляет ненужные зависимости, которые: были установлены автоматически как зависимости для других пакетов и больше не требуются ни одним установленным пакетом.

`brew autoremove`

### 5/6) `brew cleanup` vs `brew autoremove`

| Функция | brew autoremove | brew cleanup|
|---|---|---|
| Удаление ненужных зависимостей | ✅ Да | ❌ Нет |
| Удаление старых версий пакетов | ❌ Нет | ✅ Да |
| Очистка временных файлов | ❌ Нет | ✅ Да |
| Очистка кэша | ❌ Нет | ✅ Да | 

### 7) Для просмотра всех пакетов в вашей локальной среде:

`brew list --version`

Или диаграмма:

`brew deps --graph --installed`/`brew deps --tree --installed`

### 8) Извлечение старых версий пакетор

Если `brew search cocoapods` не выдает список версий через "@version", то можно извлечь предыдущую версию следующим способом:

Общий пример:
```bash
TAP=...     # <org>/<repo>, for example "my-org/homebrew-old"
MODULE=...  # name of module you want to install, e.g. "hugo"
VERS=...    # version of $MODULE you want to install, e.g., "0.80.0"
brew tap-new $TAP
brew extract --version $VERS $MODULE $TAP
brew install $TAP/$MODULE@$VERS
```

Мой пример:
```bash
brew tap-new eldaroid/cocoapods-version@1.15.1
brew extract --version=1.15.1 cocoapods eldaroid/cocoapods-version@1.15.1
brew install eldaroid/cocoapods-version@1.15.1/cocoapods@1.15.1
```

---

[4.2.1.0 Package Manager](../4.2.1.0%20PackageManager/) | [Back To iTWiki Contents](https://github.com/eldaroid/iTWiki) | [4.2.1.2 Node Package Maager Theme](/4%20Linkage/4.2%20DevTools/4.2.1%20Building/4.2.1.0%20PackageManager/4.2.1.0.2%20NodePM.md)
