bundle文件包

什么是bundle

bundle文件包是macOS上的文件夹的特殊格式,使得Finder和图形界面下的应用程序可以像打开单个文件那样打开bundle文件包。

但是,在macOS的类unix系统内核看来,bundle仍然被当成文件夹。比如,在shell/bash/zsh下:

  • 是不是文件:if [ -f <bundle的路径>]; then ... 判断为false

  • 是不是文件夹:if [ -d <bundle的路径>]; then ... 判断为true

详见:Bundle - 维基百科,自由的百科全书

bundle的文件名格式是,xxxx.特殊后缀,只有特殊后缀(如 .app, .bundle, .framework, .kext, .plugin, .textbundle…等等)才会被macOS当作bundle。

如何让Alfred能搜索到bundle

iShot_2024-01-19_16.07.45

iShot_2024-01-19_16.08.45

如何进入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 the CFBundleDocumentTypes 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,表示转换成功