Если вы работаете с PostgreSQL на macOS El Capitan (10.11.6), возможно, столкнулись с проблемой при обновлении или переустановке версии 14. Основная сложность — зависимость от библиотеки icu4c@76, которая не компилируется на этой системе из-за устаревших инструментов разработки. Вместо того чтобы тратить часы на поиски обходных путей в Homebrew, есть более эффективные подходы, которые сохранят ваше время и нервы.
Почему возникает ошибка и как с этим работать
Современные пакеты вроде PostgreSQL@14 часто требуют актуальных версий библиотек, которые могут быть несовместимы со старыми ОС. В случае с icu4c@76 ошибки компиляции (как в логе ниже) связаны с изменениями в синтаксисе C++ и отсутствием поддержки определенных флагов в старых версиях Clang на macOS 10.11:
../common/unicode/localpointer.h:551:68: note: expanded from macro 'U_DEFINE_LOCAL_OPEN_POINTER'
using LocalPointerClassName = internal::LocalOpenPointer<Type, closeFunction>
^~~~~~~~~~~~~
2 errors generated.
Здесь компилятор не понимает новые шаблоны, используемые в icu4c@76. Попытки игнорировать зависимости через --no-dependency
или откат Homebrew редко помогают, так как репозитории постепенно удаляют старые формулы. Кстати, если вы уже пробовали эти методы без результата, не переживайте — это системная проблема, а не ваша ошибка.
Переход на MacPorts: простое решение для устаревших систем
MacPorts — альтернативный менеджер пакетов для macOS, который поддерживает широкий спектр версий ОС, включая El Capitan. В отличие от Homebrew, он компилирует зависимости из исходников с учетом специфики вашей системы, что часто решает проблемы с совместимостью.
Вот как перейти на MacPorts и установить PostgreSQL@14:
1. Удалите конфликтующие пакеты Homebrew (если они есть):
brew uninstall postgresql@14 icu4c@76
2. Установите MacPorts:
- Скачайте установщик для вашей версии OSX с официального сайта.
- Запустите файл .pkg и следуйте инструкциям.
3. Обновите базу пакетов:
sudo port -v selfupdate
4. Установите PostgreSQL@14:
sudo port install postgresql14-server
5. Инициализируйте базу данных и запустите сервис:
sudo mkdir -p /opt/local/var/db/postgresql14/defaultdb
sudo chown postgres:postgres /opt/local/var/db/postgresql14/defaultdb
sudo su postgres -c '/opt/local/lib/postgresql14/bin/initdb -D /opt/local/var/db/postgresql14/defaultdb'
sudo port load postgresql14-server
После этого PostgreSQL будет доступен через порт 5432. Чтобы проверить статус, используйте:
sudo port echo postgresql14-server
Дополнительные советы и тонкости
- Миграция данных. Если у вас есть резервные копии баз данных из старой установки, скопируйте их в новую директорию /opt/local/var/db/postgresql14/.
- Обновление пакетов. MacPorts хранит файлы в /opt/local/, что изолирует их от системных библиотек. Это снижает риски поломки зависимостей.
- Альтернативные пакеты. Через MacPorts можно установить и другие утилиты, которые перестали работать в Homebrew (например, bind9 или wget), используя команду
sudo port install <имя_пакета>
.
Обратите внимание: если вы планируете использовать оба менеджера (Homebrew и MacPorts), добавьте пути MacPorts в переменную PATH перед Homebrew, чтобы избежать путаницы:
export PATH="/opt/local/bin:/opt/local/sbin:$PATH"
Подводя итог, переход на MacPorts — не просто «костыль», а полноценное решение для работы со старыми системами. Он позволяет сохранить функциональность без обновления ОС, что особенно актуально для legacy-проектов. Если возникнут сложности с настройкой, смело проверяйте логи в /opt/local/var/macports/logs/ — там подробно описаны все этапы компиляции.