Keg-only homebrew公式

57

今天我通过homebrew安装了curl公式,但在安装后(并重新源化shell)我注意到:

% which curl 
/usr/bin/curl

事实上,brew install curl的输出显示它是一个仅限当前桶(keg-only)的配方,并且由于 curl 已经存在于 OS X 中,所以 Homebrew 没有将其链接到主目录下,因为这可能会导致未指定的问题。

然后它继续说明:

  

通常对您没有任何影响

我想知道:

  • 具体会有哪些问题?
  • 通过Homebrew安装仅限当前桶(keg-only)的公式的目的是什么?如果新安装的工具不在 PATH 中会有什么后果?

我发现“通常情况下,这对您没有任何影响”的警告语措辞非常令人困惑,特别是提到了LDFLAGSCPPFLAGS。花了一段时间才意识到它适用于所有的keg-only公式。段落之间的分隔并没有清楚地表明信息所涉及的范围。 - duozmo
2个回答

60
  • 问题: 如果一个自制应用程序被放在默认OS X版本的路径前面,可能会发生任何事情。最常见的问题是由于两个版本可用的命令行选项集之间的差异或选项含义上的差异造成的。对于curl来说,后果可能不是很严重,但对于其他应用程序,你最坏的情况就是破坏操作系统。
  • Keg-only: 现在你有了两个版本的curl!默认的OS X版本和homebrew版本。如果您想使用默认版本中没有但在homebrew中的功能,则可以通过显式调用homebrew curl来实现。具体路径取决于您如何设置homebrew。因为新安装的版本不在路径中,所以除非显式调用,否则不太可能引起问题。

6
如果它们是动态链接的并且一个版本更新,也可能会出现问题 - 更新的版本的.so文件可能会以比旧版本更高的优先级链接,并破坏旧版本,特别是如果它们是非常不同的版本。 - Marc B
4
Git已经安装在Mac OS X 10.8上,但是Git Homebrew配方不是keg-only,也就是说,它将git"放在默认的OS X版本之前的路径中。"这样可以吗? - ma11hew28
1
@MattDiPasquale git不是一个关键应用程序,我认为它是由XCode安装的。无论如何,这对您的“系统”不会造成问题。 - Max13
我可以将新的curl添加到PATH中并使用不同的名称吗?例如curl-new而不是curl - CMCDragonkai
2
@CMCDragonkai 你可以使用shell别名来实现。http://tldp.org/LDP/abs/html/aliases.html - Jason Crittenden

1
我希望对@asymmetric所问的第二个问题(与keg-only机制有关)进行补充。
HomeBrew的前缀是/usr/local,HomeBrew将所有已安装的kegs保留在默认目录中,即/usr/local/Cellar。通常情况下,HomeBrew可以为已安装的公式(非keg-only公式)创建符号链接,相应的符号链接保存在/usr/local/bin中。当HomeBrew安装公式时,此符号链接创建过程是自动的。这里路径/usr/local/bin将被称为默认(符号链接)前缀。
另一方面,根据HomeBrew的FAQ,我们有以下指导:
“keg-only公式仅安装到Cellar中,并且不链接到默认前缀。这意味着大多数工具都找不到它。”
但同时,HomeBrew会为所有已安装的公式(无论是否为keg-only)在目录/usr/local/opt中创建符号链接。
我们应该注意两个关键点:
  1. 默认情况下,默认(符号链接)前缀/usr/local/binPATH中,但非前缀/usr/local/opt不在PATH中。
  2. 默认情况下,默认(符号链接)前缀/usr/local/bin通常指向配方的最新版本。因此,如果您想使用某个配方的特定版本(通常是keg-only格式),则可以临时将PATH前缀为该配方的bin目录,例如:export PATH="$(brew --prefix)/opt/FormulaName/bin:${PATH}"

上述提到的/usr/local/opt设置可以解决可执行文件冲突的问题。一般来说,您的系统可能会有许多不同版本的配方或程序,例如最新版本和过时版本、苹果本地版本和本地安装版本等。这些情况可能会导致在执行或编译与当前正在使用的配方或程序相关的其他程序时出现冲突。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接