AppPorts ユーザーガイド
このガイドでは、AppPorts の主な機能、設計方針、技術的な実装を説明します。詳しい技術情報は DeepWiki を参照してください。改善の提案は、プロジェクトの Issues にお寄せください。
概要
AppPorts は macOS 向けのアプリ移行・リンクツールです。大きなアプリを外部ストレージに移しながら、Finder、Launchpad、アプリメニュー、システムによる更新の動作をできるだけ維持します。
AppPorts の設計思想
| 方針 | 説明 |
|---|---|
| 自然な使用感 | ユーザーにも OS にも、移行したアプリがローカルのアプリと同じように使えることを目指します |
| 安定した方式 | 検証済みで、移行の安定性が高い方式を優先します |
| システム負荷の抑制 | デーモンに依存せず、システムリソースを常時消費しません |
| 幅広い言語対応 | より多くの言語に対応し、翻訳の品質を継続的に改善します |
| アクセシビリティへの配慮 | 幅広いアクセシビリティ機能を提供します |
主な機能
- 矢印アイコンのない移行:大きなアプリをワンクリックで外部ストレージに移行します。ローカルには軽量な起動用のシェルだけを残し、Finder にショートカットの矢印は表示されません。Launchpad と macOS のアプリメニューにも通常どおり表示されます。
- 自動アップデートへの対策:Sparkle、Electron、Chrome など、自動更新機能を持つアプリを検出します。「Locked Migration」を使うと、更新プログラムによる外部コピーの削除や上書きを防げます。
- バージョン同期の案内:ローカルの実体アプリが外部ストレージのコピーより新しい場合、「移行待ち」と表示します。新しいローカル版を移行して外部の旧版を置き換えられます。
- Stub Portal のバージョン同期:外部ドライブのアプリが App Store で更新されると、ローカルの Stub Portal のバージョン情報も自動で同期されます。「このアプリケーションで開く」メニューにも正しいバージョンが表示されます。
- スキャン場所の追加:JetBrains Toolbox や Steam など、追加のローカルアプリフォルダを登録できます。設定を保存し、変更も監視します。
- コード署名の管理:アプリ本体の移行後に「壊れています」と表示される場合、コンテキストメニューから再署名できます。元の署名のバックアップと復元にも対応します。サンドボックスアプリは再署名しません。
- macOS 15.1 以降の App Store に対応:App Store アプリを外部ストレージへ直接インストールし、ローカルに戻さずその場所で更新できます。
- ワンクリックで復元:アプリをローカルに戻し、リンクを自動で削除します。移行が中断した場合は自動復旧できます。
- データディレクトリの管理:
~/Library/のサブディレクトリや~/.npmなどを外部ストレージに移行できます。ツリー表示、検索、並べ替えに対応し、AppPorts の metadata で復元先を厳密に検証します。 - コンテナデータのマウント移行:WeChat のチャット履歴などのサンドボックス内データは、外部 APFS ドライブに専用ボリュームを作成し、元のディレクトリにマウントして移行します。アプリの署名は変更しません。
- フォルダの移行:ホームフォルダ内の実体フォルダを外部ストレージに移行できます。大きなプロジェクト、モデル、素材ライブラリ、ツールのキャッシュなどに適しています。再リンク、復元、パスの重複チェックにも対応します。
移行方式
Deep Contents Wrapper(Contents ディレクトリの移行)
macOS アプリの標準的なファイル構成は次のとおりです。
/Applications/Safari.app/
├── Contents/
│ ├── MacOS/
│ ├── Resources/
│ ├── Frameworks/
│ └── Info.plist
└── ...Deep Contents Wrapper は、アプリの内容をすべて外部ストレージに移し、ローカルには同名の空の .app ディレクトリを作成します。その中には、外部ストレージの Contents ディレクトリを指すシンボリックリンクだけを置きます。macOS はショートカットではなく完全な .app パッケージとして認識するため、Finder に矢印は表示されず、アイコン、Launchpad、アプリメニューも通常どおり動作します。
現在のバージョンでは廃止された方式です
Deep Contents Wrapper の主な問題は、更新プログラムがシンボリックリンクをたどり、外部ストレージのファイルを直接操作してアプリ本体を壊す可能性があることです。
Stub Portal(起動用シェル)
Stub Portal は、次の 4 項目だけを含む最小限の .app シェルをローカルに作成します。
| 要素 | 説明 |
|---|---|
Contents/MacOS/launcher | open "/Volumes/External/SomeApp.app" を実行するランチャー |
Contents/Resources/ | 外部アプリからコピーしたアイコンファイル |
Contents/Info.plist | 外部アプリの Info.plist を基に簡略化。CFBundleExecutable を launcher に設定し、LSUIElement=true を追加して Dock に表示されないようにし、更新関連のキーをすべて削除します |
Contents/PkgInfo | 標準の 4 バイト識別ファイル |
シェルをクリックすると、macOS が launcher を実行し、open コマンドで外部ストレージの実体アプリを起動します。ローカルにシンボリックリンクがないため、更新プログラムがリンク経由で外部アプリに到達することはありません。
iOS Stub Portal(iOS アプリの起動用シェル)
基本的な仕組みは標準の Stub Portal と同じですが、アイコンの処理が異なります。iOS アプリのアイコンは Info.plist で指定されず、Wrapper/ または WrappedBundle/ 内の複数の AppIcon.png に保存されています。次の手順で処理します。
- 最も解像度の高い
AppIcon.pngを探す sipsで 256×256 ピクセルに縮小するsipsで.icns形式に変換するiTunesMetadata.plistからInfo.plistを生成する(iOS アプリには標準のInfo.plistがありません)
Whole Symlink(全体のシンボリックリンク)
.app ディレクトリ全体を、外部ストレージを指すシンボリックリンクにします。
/Applications/SomeApp.app → /Volumes/External/SomeApp.appローカルにはシンボリックリンクだけが残り、実際のアプリファイルはありません。通常は macOS から開けますが、Finder のアイコンにはショートカットの矢印が表示され、Launchpad で互換性の問題が起きる場合もあります。更新プログラムがリンク経由で外部アプリのファイルを操作する可能性もあるため、AppPorts では主にほかの方式が使えない場合の移行方式として使用します。
