我正在开发一个软件包,该软件包需要在所有用户帐户均可全局访问的位置安装dylib。我实际上不确定最好的放置位置在哪里。
通常我认为/usr/local/lib
是正确的,但是偶尔我们会遇到一些对该文件夹执行奇怪操作的用户,包括更改其权限,以便只有一个用户可以访问其中的文件,从而破坏了我的软件,该系统上的用户帐户。从技术上讲,这种事情在macOS上是不允许的-/usr/local
旨在成为用户可以随意使用的地方。
另一种解决方案可以在/Library/Frameworks
或/Library/Application Support/<my app name>
中。这些文件夹肯定会更安全,因为用户不应根据需要随意使用它们,也不修改其权限。但是,对于动态库,这两个地方都没有让我感到正确。 /Library/Frameworks
是最接近的,我想我还遇到了其他将dylib放在其中的应用程序,但显然是针对框架的。
那么放置它的正确位置在哪里?
答案 0 :(得分:1)
对于文件系统位置,Mac有点奇怪,由于主要引导文件系统是只读的,因此在macOS 10.15(Catalina)发行后,它将变得更加困难。
根据访问库的目的,有一些适当的放置位置。
如果您在/Applications
文件夹中全局安装了一个应用程序(大多数应用程序在Mac上,但有时用户会将它们放在陌生的地方),则可以使用该应用程序自己的文件夹来存储库,它对于该文件夹中可以读取的任何代码均可用。但是,这样做有很多问题:用户可以移动应用程序,权限可能是错误的,并且在使用Apple Hardened Runtime的任何代码中都必须小心,因为它需要特殊的标志来加载任何其他人签名的代码而不是加载库的应用程序上的签名者。好处是删除应用程序也会删除您的库,因此您无需编写卸载程序。这项技术由VMWare Fusion等软件(如果您需要运行命令行代码或类似代码)和
如果您需要该库具有持久性并确保位于一个明确定义的位置,那么最好让用户批准将安装安装到/Library/Application Support/<your application>
或/Library/Frameworks
中。
您已经注意到,/usr/local/lib
可能会引起问题,尤其是因为流行的Homebrew软件包管理器通常将/usr/local/lib
设置为由用户使用brew安装文件时拥有,无需进行sudo
即可对其进行修改。
尽管如此,您可以安装在/usr/local/lib
中,但前提是您可能需要升级特权才能执行安装。安装完成后,通常会将目录设置为系统上的任何其他用户都可读。
作为Mac的长期用户,我更喜欢应用程序将其自身(按代码)包含在其应用程序包中,因此会鼓励使用该机制。可以通过让应用本身检查运行时间以确保安装在正确的位置来缓解用户未安装在/Applications
中的缺点,如果没有,请提示用户移动(或移动)在请求特权提升后)。这也消除了对安装程序/卸载程序的需要。
如果由于某种原因不能接受,那么/Library/Frameworks
或/Library/Application Support/<your application>
将是您的下一个最佳选择。与/usr/local/lib
相比,他们制造问题的可能性要小得多。