bundle文件包
什么是bundle
bundle文件包是macOS上的文件夹的特殊格式,使得Finder和图形界面下的应用程序可以像打开单个文件那样打开bundle文件包。
但是,在macOS的类unix系统内核看来,bundle仍然被当成文件夹。比如,在shell/bash/zsh下:
-
是不是文件:
if [ -f <bundle的路径>]; then ...
判断为false -
是不是文件夹:
if [ -d <bundle的路径>]; then ...
判断为true
bundle的文件名格式是,xxxx.特殊后缀
,只有特殊后缀(如 .app
, .bundle
, .framework
, .kext
, .plugin
, .textbundle
…等等)才会被macOS当作bundle。
如何让Alfred能搜索到bundle
如何进入bundle内部
在Finder,对着bundle单击右键,菜单内会显示显示包内容
,点击后会进入这个特殊文件夹内部。
在终端,直接cd xxxx.特殊后缀
,就能进入这个特殊文件夹内部。
bundle和文件夹相互转换
文件夹转bundle
详见: https://teknikaldomain.me/post/macos-bundles-explained/
有如下几种方法:
加后缀
在Finder或在终端(用mv xxxx xxxx.特殊后缀
命令),将文件夹重命名为xxxx.特殊后缀
,Finder会弹出提示框(如下),若点是
,则自动将它转换为bundle。
命令行
getfileinfo -aB xxxx # 若返回1表示是bundle,返回0表示不是
setfile -a B xxxx.特殊后缀 # 将文件夹属性转换为bundle属性; -a B不能写作-aB
getfileinfo -aB xxxx # 若返回0,表示转换成功
题外话:
setfile -a E xxxx.特殊后缀 # 使bundle的后缀在Finder下隐藏
setfile -a e xxxx.特殊后缀 # 使bundle的后缀在Finder下可见
Info.plist
from: https://teknikaldomain.me/post/macos-bundles-explained/
Use an extension that a program has defined in its
Info.plist
as a package type。To put that second option simply, you need a
LSTypeIsPackage
key with an appropriate value in theCFBundleDocumentTypes
key.
from: objective c - make mac package/bundle programmatically - Stack Overflow
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeName</key>
<string>Project</string>
<key>LSHandlerRank</key>
<string>Default</string>
<key>LSTypeIsPackage</key>
<true/>
<key>CFBundleTypeExtensions</key>
<array>
<string>fbp</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>document</string>
<key>CFBundleTypeRole</key>
<string>Editor</string>
</dict>
</array>
bundle转文件夹
首先,在Finder或在终端(用mv xxxx.特殊后缀 xxxx
命令),将bundle的特殊后缀去掉。但此时,macOS不会自动将它转换为文件夹,而是继续当成bundle。
此时,在Finder中双击这个文件夹,Finder无法打开开,还会引起bug:每当进入其它app(如safari)时,状态栏会闪到Finder,因而无法使用其它app。需要重启Finder才能跳出这个bug。
然后,还需要在终端,执行如下命令,将bundle属性转化为文件夹属性:
getfileinfo -aB xxxx # 若返回1表示是bundle,返回0表示不是
setfile -a b xxxx # 将bundle属性转换为文件夹属性,仅当xxxx是没有特殊后缀的文件夹时,这个命令才能生效;-a b不能写作-ab
getfileinfo -aB xxxx # 若返回0,表示转换成功