Визначте прапори, які були надані для пакунків, встановлених домашньою мовою


17

Чи є спосіб перевірити, які прапори були надані, коли пакет був встановлений з домашньою мовою?

Наприклад, формула 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

Відповіді:


15

Коли пакет створений з джерела, прапори, які були використані для створення, відображаються, коли ви це робите brew info <package>.

В цьому випадку: brew info emacs | grep "Built from source"


Інформація про заварювання завжди перераховує всі доступні параметри формули, а не параметри, які використовувались, якщо пакет був встановлений.
Праксеоліт

1
Що це не так. Інформація вказує, чи пакунок був встановлений з пляшки чи побудований з джерела, а якщо він був побудований з джерела, він показує використовувані прапори.
Андре

Відредагований ОП із прикладом, в якому, наскільки я можу сказати, інформація не вказує прапори, що використовуються для пакета, побудованого з джерела.
Праксеоліт

2
Ой, ой, я бачу це, і ваша команда grep має сенс зараз.
Праксеоліт

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 - це зручно через 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 може використовуватися для виведення списку команд встановлення варіння, які можна використовувати в іншому місці.
Санкальп

4

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


Це дійсно приємний варіант. Крім того, редагувати Brewfileта перевіряти це у вашому dotfiles repo дозволяє легко "налаштувати" нові машини. Хоча в ньому перераховані всі пакети, включаючи всі залежності. Наразі мені потрібно проаналізувати список зі 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 write

 brew_options PKGNAME

де PKGNAMEпотрібна назва домашнього пакету. Ви також можете переглядати всі встановлені пакети домашнього перекладу в рамках bash-скрипту як

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

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

   echo $PKG `brew_options $PKG`

 done

.


Примітка залежності: jqкомандний рядок процесор JSON
l --marc l
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.