为什么Homebrew创建了/ usr / local / opt目录,我应该使用它吗?

时间:2016-02-11 11:04:42

标签: macos homebrew

我在使用自制软件方面很陌生,我正试图弄清楚如何在我自己的项目中使用一些库(例如boost,gsl,openblas)。

我已经了解每个公式都是由Homebrew在/ usr / local / Cellar /中安装的,然后在usr / local / bin,usr / local / lib,usr / local / include中进行符号链接,所以看起来,除了keg - 只有公式,所以它不会混淆操作系统已安装的库(例如参见Understand homebrew and keg-only dependencies)。但我发现每个公式都链接到/ usr / local / opt目录。

所以我的问题是为什么有这个/ usr / local / opt目录(它有点冗余),以及我必须使用什么路径来使用公式(usr / local / Cellar或usr / local /或usr) / local / opt基本上)?

2 个答案:

答案 0 :(得分:34)

它为公式的内容提供了一条路径,该路径在版本升级过程中不会发生变化。

请考虑以下情况:假设您使用Homebrew构建libfoo.dylib。它是2.0.0版本,因此它位于/usr/local/Cellar/libfoo/2.0.0/lib/libfoo.dylib。您想要从正在构建的其他程序中链接到它,因此您将-L/usr/local/Cellar/libfoo/2.0.0/lib -lfoo传递给gcc。你的程序编译。稍后,您将升级到libfoo 2.0.1并删除v2.0.0。现在/usr/local/Cellar/libfoo/2.0.0/lib/libfoo.dylib不再存在,并且您的程序不再运行,因为它无法动态加载libfoo。

没关系。 libfoo.dylib也提供/usr/local/lib/libfoo.dylib。它是最新版本的libfoo的符号链接,所以它应该始终存在。所以你将-L/usr/local/lib -lfoo传递给你的程序并编译它。稍后您将升级到libfoo 2.0.1。没问题,因为/usr/local/lib/libfoo.dylib仍然存在并且指向v2.0.1副本。

那太棒了,而Homebrew在这个系统中存在了一段时间。问题是,某些公式是" keg-only",因此它们不是/usr/local的符号链接。 (通常它们只是keg,因为它们影响OS X附带的库的版本,并且取代OS X库会导致问题。)假设您要链接到仅限桶的版本的库。它未与/usr/local/lib进行符号链接,因此您必须提供/usr/local/Cellar中安装的版本的完整路径,这将回到上面列出的第一个问题。

/usr/local/opt解决了这个问题。它为当前版本的所有公式提供了一个符号链接的位置,无论它们是否只是keg。现在,当你想编译你的程序时,你可以使用-L/usr/local/opt/libfoo/lib -lfoo,你的程序将链接到最新版本的libfoo,即使你升级它,即使它只是keg-only。

答案 1 :(得分:3)

只是为了补充mipadi的答案。

来自一篇名为“/usr/local/opt”的文章

  

将文件存储在一致的位置是保持的重要部分   系统清洁和可维护。在大多数Linux系统上,占大多数   使用包管理器安装软件。包管理器   跟踪已安装的文件,以便更新和删除   软件副作用最小。

     

但是,有时软件无法通过   必须安装包管理器。尽量减少副作用   文件系统,这样的软件安装在/ usr / local中   目录。 UNIX风格的软件安装将文件放入bin中,   lib,share等在本地根目录下的子目录,但它非常   通常将软件安装到特定于包的目录中并添加   而是来自本地根的软链接。这样做很容易   删除软件 - 只需删除特定于程序包的目录   以及指向它的任何链接。

     

某些软件提供了可促进的本地安装说明   直接在/ usr / local中创建特定于包的目录。这个   不会促进良好的组织,因为它混合了UNIX层次结构   包特定目录的目录。安装   软件到特定于包的目录已在其他地方完成,   在/ opt目录中,因此有必要遵循   相同的约定并将本地安装的特定于包   / usr / local / opt目录中的目录。

     

不需要在目录名中包含版本号,但是   这是本地安装的软件的好习惯,因为它允许   多个版本同时安装和测试。跑一个   特定版本的软件,在包下运行可执行文件   目录直接。任何版本都可以通过控制成为默认版本   哪个可执行文件链接到/ usr / local / bin。例如,一个新的   可以安装和测试软件版本而无需删除   旧版。当新版本准备就绪时,/ usr / local / bin中的链接   可以更新以指向它。旧版本的软件可以   然后在不再需要时删除。

来源:版权所有©2014 Extellisys

相关问题