确定为使用自制软件安装的软件包提供的标志


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

Answers:


15

从源构建软件包时,将显示用于构建的标志brew info <package>

在这种情况下: brew info emacs | grep "Built from source"


brew info的输出始终列出该公式的所有可用选项,而不是列出已安装软件包的选项。
Praxeolitic

1
这不是真的。该信息指定软件包是从瓶子安装的还是从源构建的,如果是从源构建的,则显示已使用的标志。
2014年

据我所知,示例中的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处理器-可通过方便地homebrew)发送它,则可以选择用于安装软件包的选项,如下所示(检查gnuplot软件包):

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

告诉我我gnuplot使用以下方法进行安装:

brew install --with-qt gnuplot 

这应该是答案。
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 可用于输出您可以在其他地方使用的brew安装命令的列表。
Sankalp

4

另一个有用的工具是homebrew-bundler。通过进行安装后brew tap Homebrew/bundle,您可以运行brew bundle dump,它将创建一个Brewfile文件,该文件列出您已安装的所有软件包以及用于安装它们的所有其他args。


这确实是一个不错的选择。而且,编辑Brewfile和将其检入到您的dotfiles存储库中,可以很容易地“设置”新计算机。但是,它列出了所有软件包,包括所有依赖项。我目前必须从brew leaves仅列出顶级已安装软件包的列表中解析该列表。
eduncan911 '16

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所需的自制软件包名称在哪里。您还可以通过以下方式遍历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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.