Neutral Scent

App developments & Gadgets

今、あらためて確認するWindows Installer(MSI)の基本


この記事は、Windows & Microsoft技術 基礎 Advent Calendar 2015 12月19日分のエントリーです。
MSIとは何か?:
デスクトップWindows用のアプリを新しく導入するためのインストーラーを作成する場合、現在、最もフォーマルなアプローチがWindows Installer形式の*.msiファイルによるインストーラーを利用する方法です。

Windows Installer自体の詳細については既にWikipediaMSDNなど様々な解説がなされているので必要に応じてご参照ください。

Microsoft Windows Installer - Wikipedia
https://ja.wikipedia.org/wiki/Microsoft_Windows_Installer
Windows Installer (Windows)
https://msdn.microsoft.com/en-us/library/cc185688

MSIファイルというけれど、最近は*.exeファイル単体で実行形式になってるインストーラーが多いんじゃ? と思われるかもしれません。
また、*.zipファイルで圧縮されたSetup.exeと*.msiファイルのセットになっているインストーラーパッケージを見かけられることも多いかもしれません。
今回のエントリーではそのあたりのMSI事情を駆け足でまとめてみたいと思います。

インストーラーのパッケージの構造:
まずは、インストーラーのパッケージ形態から考えてみましょう。
MSIを利用する場合、小型のインストールランチャーを取得してからインストーラー自体がダウンロード処理を行ういわゆるWebインストーラー形式はサポートされません。
MSIで一般的な形態は、

  1. *.msiファイル単体の配布
  2. Setup.exeと*.msiファイルの配布
  3. Setup.exeと*,msiファイルをパッキングして、実行可能な*.exeとした単一実行ファイル形式
  4. Setup.exe、*.msiに加え、インストール元ファイル群を伴いisoファイル形式などによるCD/DVDイメージ
  5. 同じく、インストール元ファイルをCab形式などでパッキングしたFD分割形式

元々、Windows Installerが登場した当時は5の形式で、多数のFDを順次読み込んで実行・インストールを行うことが、インストーラーの最も重要な役割だったのですが、現在では、4の形式もVisual Studioなどごく一部の大型アプリのみとなり、1〜3の形式や、MSIを使用しないWebインストーラーが主流になっています。
.msi以外に、.mstや.msuなどのモジュールも各種ありますが、そのあたりは使う人が知っていればいい内容なので割愛します。

SetupとMSI:
さて、ここまで何度も出てきている、Setup.exeと*,msiファイルの切り分けとはなんでしょう?
なぜ最初から単体の*.exeになっていないのか、という謎ですが、現在流通している多くのインストーラーの場合、Setup.exeはそのアプリの実行に必要となる.NET Frameworkや一部のデータアクセスライブラリなどの事前要求コンポーネントをインストールし、完了後に対になった*.msiファイルを起動するという構造になっています。
このSetup.exeの役割をセットアップ・ブートストラッパー(Setup Bootstrapper)と呼びます。

.msiファイルのインストールプロセス中で.NET Frameworkを利用する場合などもあり、事前に必要なコンポーネントをインストールしておこう、という仕組みです。なので、単体のMSIファイルだけを配布して、.NET Frameworkなどの環境整備は自分でやってね、という形式のアプリケーションも多くみられます。
Windows 7以降であれば、.NET 4.0程度まではOS標準でインストールされていますので、これで十分、というケースも多いでしょう。
また、歴史的経緯からみると、Windows Installerが登場した当時のWindows 95時代には、そもそもWindows Installer自体がOSに付属しておらず、インストールするためのコンポーネントをSetup.exeで組み込む、というような動作が行われていました。

MSIの単一exeパッケージ化:
とはいえ、.NET 4.6が必要である場合、とか、それぐらい勝手にやってくれるのが気が利いたインストーラーですし、いちいちZipファイルを展開して実行するのも面倒です、このため、昨今では、ブートストラッパー自体が高機能化し、.NETのインストールはもちろん、*.msiファイルや他のコンポーネントもSetup.exeのペイロードとしてパッキングしてしまい、いわゆる自己解凍形式のインストーラーとしてMSIファイルをインストールするインストーラーも多くなっています。
また、もうどうせそこまでやるなら、とUI自体もブートストラッパーに内蔵し、古典的なWindows Installerのウィザード形式のUIを利用せず、*.msiをサイレントモードでインストールする手法なども登場しています。

もちろん、そのような高度な手法を採用し、GUIさえも独自実装してしまうのならば、MSIなど使わずにより高機能で独自形式のインストーラーを開発したほうがいいのでは? という考え方もあり、実際にそのようなインストーラー開発キットも多く流通していますが、アプリケーションのシステムへの組み込み、というデリケートな問題を扱う点や、将来サポートの継続性なども考慮すると、依然としてMSIを応用した形式のインストーラーを使用するメリットは十分にあるといっていいのではないかと思います。
Project Centennieal:
また、直近では、Windows 10のリリースとともに、Project Centennialという新しい形式のパッケージ技術がマイクロソフトから予告されており、この形式では、古典的なWin32や.NETを利用したWindowsデスクトップアプリケーションを、アプリケーション仮想化技術を応用したコンポーネント化し、隔離したサンドボックス内で実行することで、安全な配置・実行を可能にし、これによってWidows Storeからデスクトップアプリケーションを配布・販売することを実現することが謳われています。

このProject Centennial上で実行されるアプリケーションパッケージの作成においてもMSIインストーラーの使用が推奨されています。MSI形式のインストーラーを持つデスクトップアプリであれば、容易にWidnwos Storeへ登録が可能になるかもしれないよ、という状況も生まれつつあるわけです。

まとめ:
以上、昨今のWindows Installer事情をざっくりとまとめてみました。
各種インストーラー開発ツールの利用方法などについては、様々なエントリーが書かれていると思いますので、各自ググってみてください。(このエントリーもだいぶやっつけなので、後日更新するかもしれません)
2015年にもなって、インストーラーをゴリゴリ書くことになるとは思っていませんでしたが、2-in1のWindowsタブレットの普及も進み、Windows用のクリエイティブ デスクトップアプリを作ってみるのも、意外と面白いかもしれませんよ。それでは、今年も残り少なくなってまいりましたが、良いWindowsライフをお過ごしください。

続く...