このページはアーカイブされた古いページです。
インストーラ講座の目次へ



Windows インストーラ講座 − アップグレード(バージョンアップ)の考え方
MSIファイルの実行本体である Windows インストーラ では、ProductVersion(製品バージョン)とProductCode(製品コード)の変更状態により、下記の3種類のアップグレードを想定しています。
種類 変更の有無
UpgradeCode
(更新用コード)
PackageCode
(パッケージコード)
ProductVersion
(製品バージョン)
ProductCode
(製品コード)
Small Upgrade 変更しない 変更する 変更しない 変更しない
Minor Upgrade 変更する 変更しない
Major Upgrade 変更する 変更する
VSIで作成されるMSIファイルは、PackageCode = ProductCodeが既定となっていますが、VSI上からPackageCodeを確認/変更することはできません。
PackageCode を確認/変更するには、別途 Orca などのツールが必要になります。
つまり、VSIは、それ単体ではMajor Upgrade以外のアップグレードパッケージは作成できず、Minor UpgradeやSmall Upgrade用のパッケージを作成するには、Orcaが必須となります。


図:OrcaによるPackageCodeの確認例

さて、各アップグレードの形態について、それぞれかんたんに特徴を述べると、

種類 特徴
Small Upgrade 1つか2つ程度のファイル差し替えであり、バージョン番号を変えるまでもないもの。
一般的に言われる修正パッチ(Quick Fix Engineering=QFE)程度の変更。
Minor Upgrade ソフト本体のバージョン番号が変わった等の理由により、バージョン番号を変える必要はあるが、比較的小さな変更。
一般的に言われるサービスパック(SP)程度の変更。
Major Upgrade 大幅な仕様変更などの理由により、バージョン番号を変える必要がある包括的な変更。
Minor/Major Upgradeと言う呼称と、製品バージョンのメジャー番号およびマイナー番号は別物です。
あるパッケージファイルをバージョンアップする場合、Minor/Major Upgradeのいずれに該当するのかを、Windows インストーラが判断する目安は、ProductCodeの変更があるかどうかにつきます。
私見を言えば、アプリケーションバージョンをVer1.00からVer1.xxにアップグレードした場合はMinor Upgradeとして、Ver1.xxからVer2.00にアップグレードした場合はMajor Upgradeとして、それに応じたProductVersion、ProductCodeの変更を行うべきでしょう。
また、アプリケーションのバージョン番号が変わらないようなアップグレードの場合(同梱ファイルの差し替えなど)は、Small Upgradeとすべきでしょう。

となります。
Majorアップグレードはフルパッケージ(*.msi)として、Small/Minorアップグレードはフルパッケージ(*.msi)またはパッチパッケージ(*.msp)またはその両方の形式で配布されます。
Small/Minorアップグレードの場合、アップグレードした後の新規ユーザーのことを考慮し、フルパッケージを作成することになるでしょう。
パッチパッケージは、フルパッケージのファイルサイズが大きい場合で、かつ配布形態としてインターネットからのダウンロードを採用している場合に、既存ユーザーのダウンロード時間を短縮するために用意されるべきかもしれません。
しかし、多くの場合、(パッチパッケージを作成・配布するのが面倒という理由で)既存ユーザーにも、フルパッケージで配布することになるかもしれません。

フルパッケージ、パッチパッケージのいずれの場合も、アップグレードの種類によって、その実行方法が異なります。

種類 パッチパッケージ(*.msp)の実行方法
Small Upgrade msiexec /p patch.msp REINSTALL=[Feature list] REINSTALLMODE=vomus
Minor Upgrade
Major Upgrade msiexec /p patch.msp

種類 フルパッケージ(*.msp)の実行方法
Small Upgrade msiexec /i pack.msi REINSTALL=ALL REINSTALLMODE=vomus
Minor Upgrade
Major Upgrade msiexec /i pack.msi
"msiexec"は、Windows インストーラ 本体の実行ファイルです。Windows インストーラ がインストールされている環境では、拡張子(msi)について、/iオプション付きで"msiexec"に関連付けがされており、また、拡張子(msp)については、/pオプション付きで関連付けがされているはずなので、Major Upgradeの場合は、単に、pack.msi(またはpatch.msp)をダブルクリックすれば、インストールが開始されます。
Small UpgradeおよびMinor Upgradeの場合、すでに製品がインストール状態で、REINSTALLプロパティを指定せずに実行すると、「別のバージョンの製品がすでにインストールされています」と表示され、インストールを続行できません。
逆に、製品がインストールされていない状態で、REINSTALLプロパティを指定して実行すると、一見、インストール作業は正常に完了したように見えますが、実は何もインストールされていません。
パッチパッケージとしてリリースした場合は、そもそもすでに製品がインストールされているかどうかを、ユーザー側でも容易に判断できるので、インストールしている人はパッチを実行するでしょうし、インストールをしていない人はパッチを実行しようとしないでしょうから、REINSTALLプロパティを固定して指定することに特に問題はないでしょう
しかし、フルパッケージとしてリリースする場合は、事情が変わってきます。
フルパッケージをインストールする対象が、既存ユーザーと新規ユーザーの両者が考えられるからです。
REINSTALLプロパティの指定は、既存ユーザーには必要ですし、新規ユーザーには不必要です。
この問題を解決するためには、REINSTALLプロパティをMSIファイルの内部で動的に変更するような"細工"が必要になります。
この"細工"は、VSI上から行うことはできず、Orca を用いて直接MSIファイルを編集する必要があります。
その具体的な方法は、別ページ Small/Minor Upgrade にて述べます。
Small UpgradeおよびMinor Upgradeの場合に指定するコマンドライン引数について、実際にどのように指定して実行すればよいのか、疑問が生じるかもしれません。
これについては、別ページ IExpressを使った配布ファイルの作成手順 にて説明していますので、そちらを参考にして下さい。
"vomus"は、それぞれ個別の定数で、デフォルト値(何も指定していない場合)は"omus"となります。
つまり、ここでは、デフォルト値に"v"を追加した訳です。設定値のそれぞれの意味を下記に示します。
p ファイルが存在しない場合のみ再インストールを実行します。
o ファイルが存在しない、またはバージョンの古いファイルが存在する場合のみ再インストールを実行します。
e ファイルが存在しない、またはバージョンが同等、もしくは古いファイルが存在する場合再インストールを実行します。
d ファイルが存在しない、またはバージョンの異なるファイルが存在する場合再インストールを実行します。
c ファイルが存在しない、または壊れたファイルが存在する場合再インストールを実行します。
a すべてのファイルを強制的に再インストールします。
u HKEY_CURRENT_USER ハイブの必要なレジストリ エントリをすべて書き換えます。
m HKEY_LOCAL_MACHINE ハイブの必要なレジストリ エントリをすべて書き換えます。
s ショートカットをすべて再インストールし、アイコンをすべて再キャッシュして、既存のショートカットを上書きします。
v ソースから実行してユーザーのコンピュータの MSI ファイルを再キャッシュします。

Small UpgradeおよびMinor Upgradeの場合は、上記のようにコマンドライン引数を指定して実行することで、ファイルの差し替え、つまり上書きインストールが行われます。
実際にどのファイルが上書きされるべきかは、REINSTALLMODEプロパティの指定内容により判定されます。
指定値が"vomus"の場合、この判定基準は、下記のようになっています。
バージョン番号を持たないファイルの場合は、差し替えようとしているファイルの日付が、すでにある同名ファイルの日付よりも新しい場合に差し替えられます。ただし、すでにあるファイルの更新日時がその作成日時よりも新しい場合、つまり、何らかの変更が加えられている場合は、差し替えは行われません。
バージョン番号を持つファイルの場合は、差し替えようとしているファイルのバージョン番号がすでにある同名ファイルのバージョン番号よりも上位の場合に差し替えられます。
また、Small UpgradeおよびMinor Upgradeは、REINSTALLプロパティの和訳からも推測できるように、「再インストール」という考え方が前提です。
このため、以下のような注意点があります。
パッケージ内のファイル名を変更してはいけません。(MSIファイルのファイル名は、変更しても構いません)
試しに実験してみたところ、インストールしても差し替えはもちろん追加もされず、またアンインストール時に正常に削除されないなど、異常な挙動を確認できました。
パッケージ内のファイルを削除してはいけません。(ファイルを追加するのは構わないようです。)
再インストール(アップグレード)が完了しても、すでにインストール済みの該当ファイルは削除されません。
また、アンインストールしても削除されないようになるので、ゴミとして残ってしまいます。

Major Upgradeの場合は、下位メジャーバージョンとの共存が可能であることが前提となっています。
このことから、Major Upgradeを行う際は、共存できないファイル(メインプログラムなど)について、別名を付けるようにするか、または製品名およびインストールフォルダを旧メジャーバージョンとは違うものにすべきと言えるでしょう。
別名を付けるかどうか、製品名およびインストールフォルダを分けるかどうかは、下位メジャーバージョンとの共存の有無(旧メジャーバージョンの強制削除)、下位メジャーバージョンからの設定ファイルなどの引継ぎ、データフォルダなど関連フォルダとの位置関係など、総合的に判断して決定して下さい。
なお、Major Upgradeを行う際に、旧メジャーバージョンを削除してしまいたい場合もあると思います。
その方法は、別ページ Major Upgrade にて説明をしています。


参考URL
File Versioning Rules
Replacing Existing Files
Microsoft Windows インストーラ ツールのコマンド ライン スイッチ



インストーラ講座の目次へページ最上部へ