electron-builderで作ったpkgをインストールする際に実行されるスクリプトを用意する


この記事は モバイルファクトリー Advent Calendar 2017 6日目の記事です。

概要

Macでpkg拡張子を持つインストーラでは、インストール時に実行されるシェルスクリプトを配置することができ、electron-builderでもサポートされている。

Dependencies

package.json
{
  "electron-builder": "19.48.2"
}

何ができるのか

electron-builderで作るpkgでは、build/pkg-scripts以下にpostinstallまたはpreinstallというコマンドスクリプトを配置することでインストール時にhookして実行してくれる。

実行タイミングはファイル名の通り、preinstallはインストール前。postinstallはインストール後。

具体的な用法についてelectron-builder自体のドキュメントに説明が無いので分かりにくいが、electronのドキュメント中で提示されている資料とかコミットログとか、あとmacのpkgについて調べてみると出てくる。

使い方

package.jsonの設定は以下の通り

package.json
{
  "build": {
    ...
    "mac": {
      ...
      "target": {
        "target": "pkg",
        "arch": [
          "x64"
        ]
      }
    },
    "pkg": {
      "scripts": "pkg-scripts" // ここで明示的に配置場所を宣言できる
    },
    ...
  }
}
build/pkg-scripts/postinstall
#!/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にリンクを張っている

あまりインストール後にゴミが残ることは推奨できませんが、単純にappを生成するよりもアプリケーションの幅が広がるので、Mac向けビルドならば検討して良いと思います。