Вопрос или проблема
Существует ли способ выяснить, какой пакет brew
предоставляет данный файл (например, как apt-file
в Ubuntu или pkgfile
/ pacman -F
в Arch)?
Я не говорю о том, как выяснить, какой локально установленный пакет владеет файлом на моей системе, у меня есть конкретный файл, который мне нужно установить (/usr/local/lib/libboost_python.dylib
конкретно) и я хочу знать, какой удаленный пакет предоставит этот файл.
Нет. Ничто в Homebrew не поддерживает список файлов, которые пакет может или должен устанавливать.
Как указано в этом ответе, вы можете выполнить ls -l /usr/local//lib/whatever
и посмотреть, куда указывает символьная ссылка.
Хотя нет встроенной команды brew
, чтобы искать конкретный файл, установленный пакетом homebrew, вы можете использовать комбинацию brew list
и brew list <formula>
, чтобы получить ответ. Это занимает время, но если вы проводите уборку и вам нужно ответить на такого рода запрос несколько раз, вы можете сделать то, что я иногда делал: создать каталог всех файлов, которые были установлены всеми установленными пакетами homebrew:
#!/bin/sh
# сделать каталог пакетов, установленных Homebrew, по пакетам
brew list --formula |\
while read formula; do
brew list $formula |\
while read file; do
echo -e "$formula\t$file" # нужно -e, чтобы расширить \t
done
done
Если вы перенаправите вывод этого скрипта в файл, вы сможете использовать его для поиска пакета, который предоставляет интересующий файл.
Хотя нет инструмента, подобного apt-search, который позволяет находить публичные пакеты homebrew, которые могут предоставить файл, многие пакеты brew основаны на аналогах в Linux или Unix. Вы можете поискать на сайте пакетов Debian, чтобы найти необходимый пакет.
Пример поиска пакета, который предоставляет файл goocanvas.pc
Возвращает libgoocanvas-dev
brew search
не находит результатов для libgoocanvas-dev или libgoocanvas, но есть пакет goocanvas.
Вы можете определить команду ineed
следующим образом, которая вернет список с debian.org, используя ineed goocanvas.pc
:
ineed() {
echo -en $(echo \
$(curl -s "https://packages.debian.org/search?suite=default§ion=all&arch=any&searchon=contents&keywords=$1") \
| sed 's%</*tr>%\\n%g') \
| grep 'class="file"' \
| sed 's/<[^>]*>//g' \
| column -t \
| grep --color -i -w "$1"
}
Если файл является командой / бинарным файлом:
Используйте brew which-formula
:
% brew which-formula -h
Использование: brew which-formula [--explain] команда [...]
Показать, какая формула(ы) предоставляет указанную команду.
Примеры:
% brew which-formula promtool
prometheus
% brew which-formula clang
llvm
llvm@12
llvm@13
llvm@14
llvm@15
llvm@16
llvm@17
llvm@18
metashell
Вот однострочник, который у меня есть в директории bin
для этой цели:
$ cat ~/bin/brewpkg
#!/bin/bash
which -s $1 ; if [ $? -eq 0 ] ; then ls -lF `which $1` | sed -n 's/^.*\/Cellar\/\([^\/]\{1,\}\)\/.*$/\1/ p' ; fi
Ответ или решение
Чтобы определить, какой пакет Homebrew предоставляет конкретный файл, вы столкнетесь с определенными ограничениями, поскольку Homebrew не поддерживает встроенную функцию для поиска файлов, аналогично командам apt-file
в Ubuntu или pkgfile
в Arch.
1. Использование brew list
Хотя Homebrew не предоставляет прямого способа сделать это, вы можете использовать комбинацию команд brew list
и brew list <formula>
, чтобы выяснить, какие файлы входят в установленные пакеты.
Вот краткое описание процесса:
-
Получите список всех установленных формул:
brew list --formula
-
Для каждой формулы выполните:
brew list <formula>
Этот процесс может занять некоторое время, но вы можете автоматизировать его с помощью скрипта, который создает каталог всех установленных файлов, используя следующий код:
#!/bin/sh
# Создает каталог пакетов Homebrew по пакетам
brew list --formula |\
while read formula; do
brew list $formula |\
while read file; do
echo -e "$formula\t$file" # используйте -e для расширения \t
done
done
Перенаправьте вывод этого скрипта в файл, чтобы в дальнейшем использовать его для поиска пакета, предоставляющего интересующий файл.
2. Поиск в Debian Packages
Несмотря на то, что Homebrew не предлагает аналогичный инструмент, многие пакеты в Homebrew являются эквивалентами пакетов на Linux. Вы можете использовать веб-сайт Debian для поиска необходимых пакетов. Например, чтобы найти пакет, предоставляющий файл goocanvas.pc
, вы можете перейти по следующей ссылке:
Это может вернуть вам libgoocanvas-dev
. Если этот пакет недоступен в Homebrew, поищите аналогичный пакет, например, goocanvas
.
3. Определение команд и бинарных файлов
Если файл, который вы ищете, является исполняемым файлом или командой, вы можете использовать команду brew which-formula
, чтобы узнать, какой формуле принадлежит команда:
brew which-formula <command>
4. Скрипт для поиска пакета по файлу
Вы также можете создать скрипт, который будет проверять наличие команды и выводить соответствующий пакет:
#!/bin/bash
which -s $1
if [ $? -eq 0 ]; then
ls -lF $(which $1) | sed -n 's/^.*\/Cellar\/\([^\/]\{1,\}\)\/.*$/\1/ p'
fi
Сохраните этот скрипт в вашем каталоге bin
и используйте его для быстрого поиска.
Заключение
Хотя в Homebrew нет утилиты, аналогичной apt-file
, вы можете использовать вышеуказанные методы для определения пакетов, предоставляющих нужные файлы. Это может потребовать немного больше усилий по сравнению с другими менеджерами пакетов, но комбинация команд и автоматизация через скрипты может существенно упростить процесс.