前提
- App Store外でアプリケーションを配布する場合、dmgにアプリケーションに加えてApplicationsのシンボリックリンクを同梱してドラッグ&ドロップ(以下D&D)を促すようなものを見かけることがあります。
- これを応用して、ファイルを特定のディレクトリにコピーさせる用途に使えないかと思いつきました。
- 具体例としてはフォントファイルを
Library/Fonts
にD&Dでコピーさせるようなdmgを作りたいです。
参考
- create-dmgを使ったdmgの作成
- create-dmg
- .dmg with symlinks to /Library/Audio/Plug-Ins/
- Macのエイリアスとシンボリックリンクの違いや作成方法
作業例
前提
- 下図のフォルダ構成で開始します。
シンボリックリンクの作成
cd /Users/ikeh/Downloads/Test
-
/Library/Fonts/
へのシンボリックリンクを作成します。- 参考: Macでシンボリックリンクを作る
ln -s /Library/Fonts/ Fonts
- ちなみにユーザフォルダのエイリアス作成はできない?ようです。
ln -s ~/Library/Fonts/ UserFonts <- 自分の環境のパスになってしまう
ln -s “~/Library/Fonts/” UserFonts <- エイリアスの参照エラーとなる
dmgの作成
- dmgを作成します。
create-dmg \
--volname “SampleVolume” \
--window-pos 200 120 \
--window-size 812 542 \
--icon-size 100 \
--icon “対象フォント” 200 190 \
--icon “Fonts” 600 185 \
--app-drop-link 600 300 \
--codesign “Developer ID Application: XXX (xxxxxxxxx)” \
“SymbolicFontsDemo.dmg” \
“source_folder/”
dmgの動作確認
- 現在のフォルダ構成は以下の通りなっているはずです。
- 作成したdmgを開きます。
- 下図のようになり、
Fonts
とApplications
のそれぞれに対象フォント
をD&Dでコピーできます。
dmgの動作確認(ダウンロード時)
- 一見うまくいっているのですが、実際はdmgをダウンロードさせた場合にうまく動きません。
- 具体的にはダウンロードしたときに付与される拡張属性
com.apple.quarantine
がついているとうまく動きません。 -
Applications
にはD&Dでコピーできますが、Fonts
にはD&Dできない状態となります。
ls -l@ *.dmg
-rw-r--r--@ 1 ikeh staff 22152 10 27 00:29 SymbolicFontsDemo.dmg
com.apple.macl 72
com.apple.quarantine 56
- 下記が拡張属性
com.apple.quarantine
がついている場合でも、D&Dでコピーができるディレクトリの一覧とのことです。
https://forum.juce.com/t/dmg-with-symlinks-to-library-audio-plug-ins/52161/28
Applications Applications/Utilities Desktop Library/QuickLook Library/Screen Savers Library/PreferencePanes Library/CloudStorage/iCloud Drive/Desktop
- 実際に拡張属性を削除してみると、うまくコピーができることが確認できます。
xattr -d com.apple.quarantine SymbolicFontsDemo.dmg
- 蛇足にはなるがzipの場合も同様に
Applications
にはコピーできるがLibrary/Fonts
にはコピーできない動きとなった。
参考
- 以上と同様の話が.dmg with symlinks to /Library/Audio/Plug-Ins/でされているので、いくつか抜粋をメモしておきます。
Note that ~/Library isn’t an option, as the ~ is resolved at the time the symlink is made so it would be a symlink to /Users/sudara.
- シンボリックリンクの作成に
~
は使えない
So, quarantine bit … how to disable …
xattr -d com.apple.quarantine testImage.dmg
… works.
- 拡張属性
com.apple.quarantine
を取ると動作するという話。
I noted that it’s strange that I can have a notarized pkg installer that dumps all sorts of stuff everywhere — but a notarized dmg can’t do a drag and drop, even on user authentication.
- signing/notarizationしてもD&Dはできない。
So, .pkg it is then?
- .pkgが代替案になる…?
結論
- dmgに同梱するD&Dでコピーさせるために使えるシンボリックリンクは以下に限られる。
- 理由は拡張属性
com.apple.quarantine
によりセキュリティが働くため。
- 理由は拡張属性
Applications
Applications/Utilities
Desktop
Library/QuickLook
Library/Screen Savers
Library/PreferencePanes
Library/CloudStorage/iCloud Drive/Desktop