Windows Installer その2

今回は、MSI のバージョンアップについてのネタです。

Windows Installer MSI パッケージには、3 タイプのバージョンアップが用意されています。
一度、リリースした製品に対して、バージョンアップ用のインストールパッケージを
作成する際には、この 3 つの中から、どれが適切なのかを選択して、作成する必要があります。

  • メジャーアップグレード
    メジャーアップグレード処理では、旧バージョンをサイレントアンインストールしてから新バージョンを
    インストールします(REMOVE="ALL"でサイレント実行する)。
    もし、何かの情報を引き継ぎたいということであれば、自前で何らかの処理を加える必要もあります。
    どんなときにメジャーアップグレードを使うかというと、
    ・製品のバージョンアップ(v1.0 → v2.0)
    ・既存の製品からファイルが増えた(新しいコンポーネントが増えた)
    ・既存の製品からファイルが減った
    ・MSI の構成(インストールする機能の構成)が変わった
    こんな場合になるかと思います。
  • マイナーアップグレード
    マイナーアップグレードの目的は、製品自体のマイナーアップグレードです。
    製品のマイナーバージョン番号以降を更新して、ファイルを更新します。
    マイナーアップグレードでは、ファイルの増減はできません。必ず、旧バージョンと同じファイル数にしておく
    必要があります。
  • スモールアップデート
    スモールアップグレードは、特定のファイルのみを変更するアップグレードタイプです。
    製品自体のバージョンは一切変更しません。
    スモールアップグレードは、マイナーアップグレードと同様にファイルの増減はできません。
    必ず、旧バージョンと同じファイル数にしておく必要があります。

    特定のファイルのみということでパッチに近い考え方なのですが、「パッチは差分のみを提供するもの」
    「アップグレードはフルパッケージを提供するもの」という違いがあります。
    すべてのアップグレードタイプは、旧バージョンがインストール済みでなければ、そのバージョンのみを
    インストールするフルパッケージになります。
    パッチは、差分のみの提供になりますので、必ず、対象製品がインストール済みでなければなりません。
    (パッチについては別の機会で書きたいと思います)

そして、バージョンアップの話を進める前に、Windows Installer 内部では
どのように製品を区別しているのかを理解する必要があります。

Windows Installer では、3 つの GUID と製品バージョン を使用しています。

  • パッケージコード
    MSI ファイルを一意に識別するためのコードです。
  • 製品コード
    製品(プロダクト)を一意に識別するためのコードです。
    例えば、製品A v1.5 を製品A v2.0 をバージョンアップしたいという場合には、
    同じ製品コードのままにしておきます。もし、製品A v1.5 を製品A v2.0 を共存させたいと
    いった場合には、異なる製品コードにします。
  • アップグレードコード
    アップグレードコードは、製品ファミリーを一意に識別するために使用します。
    このコードは、旧バージョンのアンインストールの際に判定する材料です。
  • 製品バージョン
    Windows Installer では、aa.bb.cccc という形式で数値のみで識別します。
    aa は、メジャーバージョン番号を、bb は、マイナーバージョン番号を、cccc は、ビルド番号を示します。
    aa と bb は、255 以下でなければなりません。cccc は、65535 以下になります。

Windows Installer では、これらの識別子を用いて、バージョンアップの判定を行います。
では、これらをどのように使ってバージョンアップ用の MSI を作るのかというと…

  パッケージコード 製品バージョン 製品コード アップグレードコード
メジャーアップグレード 変更する 変更する 変更する そのまま
マイナーアップグレード 変更する 変更する そのまま そのまま
スモールアップグレード 変更する そのまま そのまま そのまま

のように、設定します。

ちなみに、マイナーアップグレードとスモールアップグレードの MSI ファイルは、そのまま実行する
(ダブルクリック)とエラーになります。
Windows Installer は、インストール実行時に同一の製品コードがあるかどうかを検索して、もし、
同一の製品コードが見つかった場合には、すでにインストールキャッシュされている MSI を使ってしまいます。
このため、マイナーアップグレードとスモールアップグレードを作成する場合には、セットアップランチャー
(setup.exe)を用意するか、以下のコマンドで実行する必要がありますので、注意しましょう。

msiexec /i product.msi REINSTALLMODE=voums REINSTALL=ALL

さて、アップグレードの際には、ファイルを更新するわけですから、ファイルのバージョンアップルールを
簡単に書いておきます。(詳細は、http://msdn.microsoft.com/en-us/library/aa368599(VS.85).aspx

Windows Installer では、バージョン、日付、言語の 3 つを主に判定材料にしています。

File Versioning Rule

  1. 比較対象ファイルの両方にバージョンがある
    ・バージョンの高い方を保持する
     バージョンの低いファイルよりもバージョンの高いファイルが優先される。
    ・バージョンが同じ場合
     インストール済みファイルの言語とインストールするファイルの言語を調べ
     異なる場合には、インストールするファイルを優先する。
  2. 比較対象ファイルのバージョンがない
    Windows Installer 2.0 以降はファイルハッシュ値も判定材料にしています。
    ・既存ファイルの作成日付と更新日付が異なる
     既存ファイルを優先(残し)し、ファイルのインストールは行わない。(ユーザーが更新したと見なします)
    ・既存ファイルの作成日付と更新日付が同じ
     ファイルハッシュが同じ場合には、既存ファイルを残し、ファイルハッシュが異なる場合には
     インストールするファイルを優先する。
  3. 比較対象ファイルの片方のみにバージョンがある
    ・バージョンがある方を保持する
     リソースにバージョンがあるファイルの方がバージョンの無いファイルよりも優先される。

非常に簡単に書きましたが、実際には、いろいろなことをやっています。

この辺を理解した上で、どのような動きになるのかをきちんとドキュメントに残しておくと保守の際に役立つと思います。


今回は、MSI のバージョンアップについての概要を紹介しました。
製品をリリースした以上は、次の何からのリリースがあると思います。
きちんと内部動作を理解した上で、作成するバージョンアップインストーラーをどのタイプにするかを
よーく考える必要があります。
ただ、迷ったら、メジャーアップグレードにしておくのが無難です。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。