この記事は モバイルファクトリー Advent Calendar 2017 6日目の記事です。
概要
Macでpkg拡張子を持つインストーラでは、インストール時に実行されるシェルスクリプトを配置することができ、electron-builderでもサポートされている。
Dependencies
{
"electron-builder": "19.48.2"
}
何ができるのか
electron-builderで作るpkgでは、build/pkg-scripts
以下にpostinstall
またはpreinstall
というコマンドスクリプトを配置することでインストール時にhookして実行してくれる。
実行タイミングはファイル名の通り、preinstall
はインストール前。postinstall
はインストール後。
具体的な用法についてelectron-builder自体のドキュメントに説明が無いので分かりにくいが、electronのドキュメント中で提示されている資料とかコミットログとか、あとmacのpkgについて調べてみると出てくる。
- 資料: http://macinstallers.blogspot.jp/2012/07/scripting-in-installer-packages.html
- 該当commit: https://github.com/electron-userland/electron-builder/commit/2eb12987ce1842a8291595ea9cdcf4db3e8fe298#diff-ca9a81b8204b29fbe42a0cf8168b0a04
使い方
package.jsonの設定は以下の通り
{
"build": {
...
"mac": {
...
"target": {
"target": "pkg",
"arch": [
"x64"
]
}
},
"pkg": {
"scripts": "pkg-scripts" // ここで明示的に配置場所を宣言できる
},
...
}
}
#!/bin/sh
# インストール完了後、hogeが生成される
touch /Users/***/hoge
スクリプト内で使用できる変数は以下の通り
-
$1
: 実行しているpkgのフルパス- 例: /Volumes/Users/Vikrams/Desktop/TestPkg.pkg
-
$2
: インストール先のディレクトリのフルパス 例: /Applications -
$3
: ペイロードを受け取るためのボリューム(またはマウントポイント)- 例: /Volumes/Tools
-
$4
: システムのルートディレクトリ- /
-
$SCRIPT_NAME
: 実行するファイル名- 例: preflight
-
$PACKAGE_PATH
:$1
と同じ -
$INSTALLER_TEMP
: インストール実行時に置かれるテンポラリファイル。 この領域を一時的な作業に使用することもできるが、インストーラファイルを上書きしてはいけない。 このファイルはインストール完了時に削除される。- 例: /private/tmp/.vikrams.pkg.234.install
利用例
- アプリケーションインストール後に自身を起動する
- アプリケーションと一緒にcliもインストールする。
- 例えばAtomだと
メニュー -> Atom -> Install Shell Commands
からatom
コマンドがインストールできるが、postinstall
コマンドを配置しておけばインストールと同時にcliコマンドを作ってしまえる。 - Atomは
/Applications/Atom.app/Contents/Resources/app/atom.sh
にリンクを張っている
- 例えばAtomだと
あまりインストール後にゴミが残ることは推奨できませんが、単純にappを生成するよりもアプリケーションの幅が広がるので、Mac向けビルドならば検討して良いと思います。