Определите флаги, которые были даны для пакетов, установленных с homebrew

17

Есть ли способ проверить, какие флаги были заданы, когда пакет был установлен вместе с homebrew?

Например, формула emacs имеет абсурдное количество флагов. Если я сделал

brew install emacs --with-glib --with-librsvg

Позже я хотел бы определить, что для домашней установки emacs я дал флаги, --with-glib --with-librsvgа не другие флаги.

Тестовый набор с пакетом lua:

Перед установкой пакета информация показывает все опции.

$ brew info lua
lua: stable 5.2.3 (bottled)
http://www.lua.org/
Not installed
From: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/lua.rb
==> Options
--universal
    Build a universal binary
--with-completion
    Enables advanced readline support
--without-sigaction
    Revert to ANSI signal instead of improved POSIX sigaction

Я устанавливаю пакет только с --with-completionфлагом.

$ brew install lua --with-completion
==> Downloading http://www.lua.org/ftp/lua-5.2.3.tar.gz
######################################################################## 100.0%
==> Downloading http://luajit.org/patches/lua-5.2.0-advanced_readline.patch
######################################################################## 100.0%
==> Downloading http://lua-users.org/files/wiki_insecure/power_patches/5.2/lua-5
######################################################################## 100.0%
==> Patching
patching file Makefile
patching file src/Makefile
patching file src/lua.c
Hunk #1 succeeded at 231 (offset -5 lines).
Hunk #2 succeeded at 559 (offset -4 lines).
Hunk #3 succeeded at 575 (offset -4 lines).
patching file src/lua.c
==> make macosx INSTALL_TOP=/usr/local/Cellar/lua/5.2.3_1 INSTALL_MAN=/usr/local
==> make install INSTALL_TOP=/usr/local/Cellar/lua/5.2.3_1 INSTALL_MAN=/usr/loca
🍺  /usr/local/Cellar/lua/5.2.3_1: 13 files, 312K, built in 6 seconds

После установки пакета информация показывает все параметры, включая те, которые я не использовал. Команда подтверждает, что пакет был собран из источника, а не вылит из бутылки.

$ brew info lua
lua: stable 5.2.3 (bottled)
http://www.lua.org/
/usr/local/Cellar/lua/5.2.3_1 (13 files, 312K) *
  Built from source with: --with-completion
From: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/lua.rb
==> Options
--universal
    Build a universal binary
--with-completion
    Enables advanced readline support
--without-sigaction
    Revert to ANSI signal instead of improved POSIX sigaction
Praxeolitic
источник

Ответы:

15

Когда пакет собран из исходного кода, флаги, которые использовались для сборки, отображаются при этом brew info <package>.

В таком случае: brew info emacs | grep "Built from source"

Андре
источник
Вывод информации brew всегда перечисляет все доступные опции для формулы, а не опции, используемые, если пакет был установлен.
Praxeolitic
1
Это не правда. Информация указывает, был ли пакет установлен из бутылки или собран из источника, и если он был собран из источника, он показывает флаги, которые были использованы.
Андре
Отредактировал OP с примером, в котором, насколько я могу судить, info не указывает флаги, используемые для пакета, созданного из исходного кода.
Praxeolitic
2
Ой, я вижу это, и теперь ваша команда grep имеет смысл.
Praxeolitic
6

Существует файл в /usr/local/Cellarпод каждый пакет , который называется INSTALL_RECEIPT.json, например , для gawk:

/usr/local/Cellar/gawk/4.1.3/INSTALL_RECEIPT.json

это определяет, как пакет был установлен. Я думаю, что правильный способ доступа к нему с

brew info --json=v1 <packagename>

например

brew info --json=v1 gnuplot

Это извергает кучу вещей, но если вы отправите их через jq(JSON Processor - легко доступны через homebrew), вы можете выбрать параметры, которые вы использовали для установки пакета, как это (проверка gnuplotпакета):

brew info --json=v1 gnuplot | jq '.[].installed[0].used_options'
[
    "--with-qt"
]

который говорит мне, что я установил, gnuplotиспользуя:

brew install --with-qt gnuplot 
Марк Сетчелл
источник
Это должно быть ответом.
Джейкоб Дегелинг
for package in $(brew list); do echo -n "brew install $package "; for item in $(brew info --json=v1 $package | jq -r '.[0].installed[0].used_options | .[]'); do echo -n "$item "; done; echo ; done 2>/dev/null может использоваться для вывода списка команд brew install, которые вы можете использовать в другом месте.
Sankalp
4

Еще один полезный инструмент homebrew-bundler. После установки через brew tap Homebrew/bundle, вы можете запустить, brew bundle dumpи он создаст файл Brewfile, в котором перечислены все установленные вами пакеты, а также любые дополнительные аргументы, использованные для их установки.

rmarscher
источник
Это действительно хороший вариант. И, чтобы отредактировать Brewfileи зарегистрировать его в своем репозитории dotfiles, легко "настроить" новые машины. Тем не менее, в нем перечислены все пакеты, включая все зависимости. В настоящее время мне приходится анализировать список из brew leavesсписка, в котором перечислены только установленные пакеты верхнего уровня.
eduncan911
3

Вот небольшая функция bash, которая возвращает флаги независимо от того, был ли пакет собран из исходного кода или нет.

function brew_options()
{
    [ "$#" -ne 1 ] && >&2 echo -e "$FUNCNAME requires only 1 option, the package name" && return 1

    local item=$1
    local opts

    ## Check if package installed
    [ -n "$(brew ls --versions $item)" ] || ( >&2 echo -e "$item is not installed" && return 1 )

    set -o pipefail

    ## Get options if built from source
    if ! opts="$(brew info $item | grep 'Built from source with:' | sed 's/^[ \t]*Built from source with:/ /g; s/\,/ /g')" ; then
        # If not built from source, get options from brew metadata
        opts="$(brew info --json=v1 $item | jq -ec '.[].installed[0].used_options' | awk '{print substr($0, 2, length($0) - 2)}' | sed 's/,/ /g;s/"//g')"
    fi

    ## If we're able to get options and its just not spaces echo it 
    if [ "$?" -eq 0 ] && [[ ! -z "${opts// }" ]]; then
        echo "$opts"
    fi

    set +o pipefail

}

Чтобы использовать эту функцию bash в скрипте bash, напишите

 brew_options PKGNAME

где PKGNAMEназвание желаемой домашней упаковки. Вы также можете перебрать все установленные пакеты homebrew в скрипте bash как

 # Command to generate install script
 PKGS=$(brew list)

 # iterate through all packges
 for PKG in $PKGS; do

   echo $PKG `brew_options $PKG`

 done

,

Killeroid
источник
примечание зависимости: jqпроцессор JSON командной строки
l