Tentukan flag yang diberikan untuk paket yang diinstal dengan homebrew

17

Apakah ada cara untuk memeriksa bendera apa yang diberikan ketika paket diinstal dengan homebrew?

Misalnya, rumus emacs memiliki jumlah bendera yang tidak masuk akal. Jika saya melakukannya

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

Saya ingin kemudian menentukan bahwa untuk instalasi emacs homebrew saya memberikan bendera --with-glib --with-librsvgdan bukan bendera lainnya.

Test case dengan paket lua:

Sebelum menginstal paket, info menunjukkan semua opsi.

$ 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

Saya menginstal paket hanya dengan --with-completionbendera.

$ 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

Setelah menginstal paket, info menunjukkan semua opsi, termasuk yang tidak saya gunakan. Perintah itu mengakui bahwa paket itu dibuat dari sumber dan tidak dituangkan dari botol.

$ 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
sumber

Jawaban:

15

Ketika sebuah paket dibangun dari sumber, flag yang digunakan untuk membangun akan ditampilkan ketika Anda melakukannya brew info <package>.

Pada kasus ini: brew info emacs | grep "Built from source"

André
sumber
Output info minuman selalu mencantumkan semua opsi yang tersedia untuk formula, bukan opsi yang digunakan jika paket diinstal.
Praxeolitic
1
Itu tidak benar. Info menentukan apakah paket itu diinstal dari botol atau dibangun dari sumber, dan jika itu dibangun dari sumber itu menunjukkan bendera yang digunakan.
André
OP yang diedit dengan contoh di mana, sejauh yang saya tahu, info tidak menentukan flag yang digunakan untuk paket yang dibuat dari sumber.
Praxeolitic
2
Oh oops, saya melihatnya dan perintah grep Anda masuk akal sekarang.
Praxeolitic
6

Ada file di /usr/local/Cellarbawah setiap paket yang dipanggil INSTALL_RECEIPT.json, misalnya untuk gawk:

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

yang menentukan bagaimana paket itu diinstal. Saya pikir cara yang benar untuk mengaksesnya adalah dengan

brew info --json=v1 <packagename>

misalnya

brew info --json=v1 gnuplot

Itu memuntahkan banyak barang, tetapi jika Anda mengirimkannya melalui jq(Prosesor JSON - tersedia melalui homebrew), Anda dapat memilih opsi yang Anda gunakan untuk menginstal paket seperti ini (memeriksa gnuplotpaket):

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

yang memberitahu saya saya menginstal gnuplotmenggunakan:

brew install --with-qt gnuplot 
Mark Setchell
sumber
Ini seharusnya jawabannya.
Jacob Degeling
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 dapat digunakan untuk menampilkan daftar perintah instal buatan yang dapat Anda gunakan di tempat lain.
Sankalp
4

Alat lain yang bermanfaat adalah homebrew-bundler. Setelah diinstal melalui brew tap Homebrew/bundle, Anda dapat menjalankan brew bundle dumpdan itu akan membuat file Brewfile yang mencantumkan semua paket yang telah Anda instal bersama dengan argumen tambahan yang digunakan untuk menginstalnya.

rmarscher
sumber
Ini memang pilihan yang bagus. Dan, untuk mengedit Brewfiledan mengeceknya ke dalam repo dotfiles Anda membuatnya mudah untuk "mengatur" mesin baru. Padahal, itu mencantumkan semua paket termasuk semua dependensi. Saat ini saya harus menguraikan daftar dari brew leavesdaftar yang hanya mencantumkan paket tingkat atas yang diinstal.
eduncan911
3

Inilah sedikit fungsi bash yang mengembalikan flag-flag terlepas dari apakah paket dibangun dari sumber atau tidak.

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

}

Untuk menggunakan fungsi bash ini dalam penulisan skrip bash

 brew_options PKGNAME

di mana PKGNAMEnama paket homebrew yang diinginkan. Anda juga dapat mengulangi semua paket homebrew yang terinstal dalam skrip bash sebagai

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

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

   echo $PKG `brew_options $PKG`

 done

.

Killeroid
sumber
catatan ketergantungan: jqprosesor JSON baris perintah
l --marc l