Как определить, какой пакет brew предоставляет данный файл?

Вопрос или проблема

Существует ли способ выяснить, какой пакет 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

https://packages.debian.org/search?suite=default&section=all&arch=any&searchon=contents&keywords=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&section=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>, чтобы выяснить, какие файлы входят в установленные пакеты.

Вот краткое описание процесса:

  1. Получите список всех установленных формул:

    brew list --formula
  2. Для каждой формулы выполните:

    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, вы можете перейти по следующей ссылке:

Debian Package Search

Это может вернуть вам 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, вы можете использовать вышеуказанные методы для определения пакетов, предоставляющих нужные файлы. Это может потребовать немного больше усилий по сравнению с другими менеджерами пакетов, но комбинация команд и автоматизация через скрипты может существенно упростить процесс.

Оцените материал
Добавить комментарий

Капча загружается...