Как мы можем "убедить" fink, port и brew сосуществовать параллельно на OSX Mavericks?
Нам нравится использовать brew
, но это не так много gnome
формул набора инструментов, и мы можем установить gnome-terminal
очень быстро с FinkCommander
, Мы построили различные части gnome
с нуля, но создавая brew
формула просто чтобы получить gnome-terminal
кажется излишним, когда он уже доступен.
Несмотря на это, у нас были проблемы со строительством gnome-terminal
с FinkCommander
то есть пока мы не удалили все brew
ссылки на установленные компоненты из переменных среды; мы, конечно, должны были принять /usr/local/bin
а также /usr/local/opt/gnu-tar/libexec/gnubin
снаружи $PATH
и просто ради удовольствия мы убедились ${DY}LD_LIBRARY_PATH
не указал на /usr/local/lib
и т. д. Это разрешено gnome-terminal
построить и успешно установить с FinkCommander
,
Кроме того, у нас есть программное обеспечение, которое мы хотим установить через brew
, fink
и port
- но brew
плохо играет с другими. Это привело к более общему вопросу: достаточно ли просто переключать переменные пути и среды для переключения между brew
а также fink
/ port
создавать среды и установки? Мы знаем, что нам нужно спрятаться brew
от fink
через переменные окружения при сборке gnome-terminal
с FinkCommander
и предположение, что для некоторых brew
определенная формула, обратное верно.
Что вообще мы должны сделать, чтобы иметь лучшее из всех трех миров? То есть, что нужно сделать, чтобы все три, brew
, fink
, а также port
, построен и установлен параллельно? Поскольку все управляемые пакеты были созданы с нуля, каждый пакет должен знать, где находятся его собственные динамически связанные библиотеки. Достаточно ли перемешать вокруг $PATH
, $MANPATH
& $DYLD_LIBRARY_PATH
переменные среды на лету, чтобы поставить одну установку перед другой, чтобы использовать ее определенные инструменты? Мы что-то упустили?
2 ответа
Позвольте мне ответить на это с точки зрения MacPorts, откуда я пришел, поскольку эти проблемы сосуществующих инструментов управления программным обеспечением там не неизвестны. Самое главное, просто нет возможности удалить /usr/local
из путей поиска компилятора по умолчанию. Это может привести к проблемам с некоторыми сборками, особенно во время мульти-архитектуры +universal
сборник.
В начале проекта много лет назад MacPorts перешел на /opt/local
во избежание проблем с другим программным обеспечением. Полная изоляция от /usr/local
кажется невозможным только с помощью флагов конфигурации компилятора. К сожалению, разработчики Homebrew сознательно проигнорировали это и выбрали по умолчанию / usr / local. Хотя это звучит как хорошая идея, так как она уже указана в PATH, в конфигурации по умолчанию /usr/local/bin
происходит только после /usr/bin
, что делает невозможным перезапись любых инструментов командной строки. Таким образом, нет никакого преимущества использования /usr/local
совсем.
Лучшее решение - установить Homebrew по любому другому пути (например, /opt/homebrew
) или временно переименовать / usr / local перед сборкой и переименовать его потом:
sudo mv /usr/local /usr/local.off
... # do your compilation work
sudo mv /usr/local.off /usr/local
Как примечание на будущее, хотя MacPorts в своей текущей версии уже использует "песочницу" для всех сборок, в этой области есть улучшения для версии 2.3.0 или более поздней. Новый режим трассировки, который в настоящее время разрабатывается, позволит ограничить доступ всех файлов к тем файлам, которые требуются только для конкретной задачи сборки, скрывая такие места, как /usr/local
а также /sw
полностью из процесса сборки. Однако это не поможет другим инструментам, если они не примут эту функцию также.
Так как каждая система портов обычно имеет свои особенности (и случайный порт не удается построить из-за какой-то странности, скрытой в глубине пути зависимостей), у меня есть одна система с установленными параллельно HomeBrew, MacPorts и FreePorts. Для среды сборки обычно достаточно, чтобы они не могли обнаружить другие установки системы портов во время сборки и во время компиляции, чтобы разделить их, чтобы они не начинали создавать зависимости друг от друга, или, что еще хуже, отказывали и получали залог из-за зависимости, обнаруженной в неправильное дерево портов.
До сих пор было достаточно инициализировать чистую среду здания, в которой есть только системные каталоги (избегайте /usr/local
для MacPorts, Fink, FreePorts, см. ответ Raims) + свои собственные целевые каталоги в своих путях поиска, пути компоновщика и т. д., как уже описано в вопросе выше.
Для сборки я предварительно отрисовываю дерево систем портов в порядке поиска по каталогам, чтобы избежать жалоб времени настройки на устаревшие версии, обнаруженные в стандартном MacOSX системой сборки портов. Для пользователя, использующего порт, безопаснее добавлять эти деревья, чтобы отдавать предпочтение двоичным файлам, предоставляемым ОС.
Если вам нужно скопировать установленные деревья портов, ditto
будет инструментом выбора. Из справочной страницы:
ditto
при копировании сохранит ветки ресурсов и информацию метаданных HFS, если не указано иное, используя--norsrc
, Так же,ditto
сохранит расширенные атрибуты и списки контроля доступа (ACL), если--noextattr
или же--noacl
передается.
Другой вариант будет /usr/bin/rsync -avSEH
:
a
режим Rchive,v
Erbose не является обязательным,E
сохранить расширенные атрибуты и ACL,S
правильно обрабатывать разреженные файлы (без расширения их до полной емкости, занимая больше места, чем оригинал), иH
сохранить жесткие ссылки.
Для tar
который хорошо обрабатывает ACL (объясненные здесь) и расширенные атрибуты, взгляните на star
очень зрелый (1982) tar
реализация, которая до сих пор активно поддерживается его первоначальным автором. Вы можете скомпилировать его, используя одну из вышеупомянутых систем портов, или установить как часть schilytools
,