トップ回答者
インストーラによるアップグレードで更新されないアセンブリがある

質問
-
Visual Studio 2010 でインストーラを作成しています。新規インストールでは問題ないのですが、アップグレードインストールで結果としてエラーもなくインストーラは終了するのですが、アセンブリがアップグレードされないという現象に悩まされています。アップグレードは Minor Upgrade です。各種 Web サイトを参考にして以下の設定でインストーラを作成しています。・Product Version を変更 → ex) 1.0.12 → 1.0.13・Product Code は変更せず・Package Code は Visual Studio で明示的に変更していないものの自動的に変更される(ので、特に何もしてません)・各アセンブリは、Product Version に合わせて、変更上記設定でインストーラを以下のコマンドラインで実行してます。msiexec /passive /norestart /i xxxx.msi REINSTALL=ALL REINSTALLMODE=vomus従来もこのような方法でインストーラを作成し別段問題なく動作しておりました。もし、何かこの件でお分かりの方情報を頂けると助かります。
回答
-
うーん。。。もしかして、前回のものから今回のものにアップデートするにあたって何かファイルやレジストリを削除したとか、リネームしたということがありませんか?もしくは追加したとか。。。
このログは、平たく言うと、マイナーアップグレードできない状態だから無理!っていうことです。実際、VSセットアップ、IS-LE の2つについては、マニュアルレベルでマイナーアップグレードができないことを明記しています(http://msdn.microsoft.com/ja-jp/library/ee721500.aspx)。
もちろん現実的には全くできないわけではありません。ファイルやレジストリなどの増減が全くない状況なら何ら問題なくマイナーアップグレードができます。ですが、構成に変更がある場合はどこでComponent情報が崩れるかわからないため、マイナーアップグレードができないパターンが発生します。
具体的にはどういう条件でマイナーアップグレードができないか?を知っていないと検出できないので、これについては必要なら勉強してくださいとしか言えません(http://msdn.microsoft.com/en-us/library/aa370579(VS.85).aspx)。
個人的には、どうしてもマイナーアップグレードをサポートする必要があるのなら、Component をきっちり管理できる(しなければならない)、WiXか、IS(Pro以上)をインストーラ作成ツールとして選択することをお勧めします。VSセットアップや、IS-LE(Expressも同様)を選ぶのなら、マイナーアップグレードではなく、更新は常にメジャーアップグレードを選択することをお勧めします。
わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/- 回答としてマーク るいるい1 2011年6月28日 5:39
すべての返信
-
ログを見て気付いたことを追記します。
正常にアップグレードできた時とうまくいかなかった場合のログを比較したら以下の差があることがわかりました。
■正常時のログ
MSI (s) (40:1C) [11:00:05:428]: Feature: DefaultFeature; Installed: Local; Request: Reinstall; Action: Reinstall
MSI (s) (40:1C) [11:00:05:428]: Component: C__0184D43C5A2693C27936771868963E83; Installed: Local; Request: Local; Action: Local
MSI (s) (40:1C) [11:00:05:428]: Component: C__01B1B906EBB14E578D8418C966ED7644; Installed: Local; Request: Local; Action: Local
■問題のあったときのログ
MSI (s) (40:8C) [11:03:51:039]: Feature: DefaultFeature; Installed: Advertise; Request: Reinstall; Action: Reinstall
MSI (s) (40:8C) [11:03:51:039]: Component: C__01B1B906EBB14E578D8418C966ED7644; Installed: Local; Request: Null; Action: Null
MSI (s) (40:8C) [11:03:51:039]: Component: C__12CF948233044BBE98CBC3B9C87D3D49; Installed: Local; Request: Null; Action: Null
Installed: Advertise となっていること、そして Request や Action が Null になっていることが直接的な原因でしょうか。もっとも、これらの意味を理解しておらず不勉強で申し訳ありません。 -
Installed が Advertise になる条件って何かあったかな?覚えてない。
ところで、アップグレードできない環境にはなにか条件がありますか?それともどのような環境でインストール->アップグレードとしてもこのエラーが出るのでしょうか?
もし、後者(環境によらずエラーになる)という場合は、WindowsSDKにあるmsiの比較データを出力するスクリプト(http://msdn.microsoft.com/en-us/library/aa372504(VS.85).aspx)があるのでそれを使って比較してみてください。
マイナーアップグレードは原則としてデリートされた項目があると失敗します。
わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/ -
とっちゃん様
貴重な情報ありがとうございます。
今のところ、どの様な環境でも、正常終了するも、ファイルが更新されないという状況で、一様にうまくいきません。
比較スクリプトを試してみました。恐縮ですが正直なところどうやってこの出力結果を見て良いかわかりませんが、少なくともファイルの削除はありません。
なお、正常にアップグレードできた過去のインストーラのログと正常に動作しないログを比較したところ、今回のアップグレードで以下の気になるログが出力されていること
わかりました。MSI (s) (40:8C) [11:03:51:036]: SELMGR: ComponentId '{D72DDA45-EE3D-3264-ABD3-3A34626903F2}' is registered to feature 'DefaultFeature', but is not present in the Component table. Removal of components from a feature is not supported!
もう少しログを解析してみます。
-
うーん。。。もしかして、前回のものから今回のものにアップデートするにあたって何かファイルやレジストリを削除したとか、リネームしたということがありませんか?もしくは追加したとか。。。
このログは、平たく言うと、マイナーアップグレードできない状態だから無理!っていうことです。実際、VSセットアップ、IS-LE の2つについては、マニュアルレベルでマイナーアップグレードができないことを明記しています(http://msdn.microsoft.com/ja-jp/library/ee721500.aspx)。
もちろん現実的には全くできないわけではありません。ファイルやレジストリなどの増減が全くない状況なら何ら問題なくマイナーアップグレードができます。ですが、構成に変更がある場合はどこでComponent情報が崩れるかわからないため、マイナーアップグレードができないパターンが発生します。
具体的にはどういう条件でマイナーアップグレードができないか?を知っていないと検出できないので、これについては必要なら勉強してくださいとしか言えません(http://msdn.microsoft.com/en-us/library/aa370579(VS.85).aspx)。
個人的には、どうしてもマイナーアップグレードをサポートする必要があるのなら、Component をきっちり管理できる(しなければならない)、WiXか、IS(Pro以上)をインストーラ作成ツールとして選択することをお勧めします。VSセットアップや、IS-LE(Expressも同様)を選ぶのなら、マイナーアップグレードではなく、更新は常にメジャーアップグレードを選択することをお勧めします。
わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/- 回答としてマーク るいるい1 2011年6月28日 5:39
-
とっちゃん様 たびたびのご返信本当にありがとうございます。
うーん。。。もしかして、前回のものから今回のものにアップデートするにあたって何かファイルやレジストリを削除したとか、リネームしたということがありませんか?もしくは追加したとか。。。
確認してみたんですが、ないんです。というか、見落としや勘違いなのかもしれません。。。
ただし、ログに出力されている GUID(?)を元に調べたところ、 msvcr90.dll が原因のようです。
とはいえ、このモジュールはマージモジュールでインストールされるはずで、マージモジュールが変わった?のでしょうか。
このへんも含めて変更は明示的にしてはいないのですが...。このログは、平たく言うと、マイナーアップグレードできない状態だから無理!っていうことです。実際、VSセットアップ、IS-LE の2つについては、マニュアルレベルでマイナーアップグレードができないことを明記しています(http://msdn.microsoft.com/ja-jp/library/ee721500.aspx)。
もちろん現実的には全くできないわけではありません。ファイルやレジストリなどの増減が全くない状況なら何ら問題なくマイナーアップグレードができます。ですが、構成に変更がある場合はどこでComponent情報が崩れるかわからないため、マイナーアップグレードができないパターンが発生します。
具体的にはどういう条件でマイナーアップグレードができないか?を知っていないと検出できないので、これについては必要なら勉強してくださいとしか言えません(http://msdn.microsoft.com/en-us/library/aa370579(VS.85).aspx)。
個人的には、どうしてもマイナーアップグレードをサポートする必要があるのなら、Component をきっちり管理できる(しなければならない)、WiXか、IS(Pro以上)をインストーラ作成ツールとして選択することをお勧めします。VSセットアップや、IS-LE(Expressも同様)を選ぶのなら、マイナーアップグレードではなく、更新は常にメジャーアップグレードを選択することをお勧めします。
根本的に私も勘違いしていた点がありました。
今回のバージョンアップは、Ver1.1.0 → Ver1.2.0 の様なアップグレードだったので、インストーラーもマイナーアップグレードしなければならないと思い込んでいました。バージョン表記とインストーラで選択すべきアップグレード方法は全く別で考えるべきなんですね。
今回は取り急ぎメジャーアップデートで対応しようと思います。しかし、今回の件を踏まえ個人的には、「ならば常にメジャーアップデートでもよいのではないか?」と安直に考えてしまうのですが、マイナーアップグレードにすべきケースというものがよくわからなくなってしまいました。
もし差し支えなければ、この件に関する情報やサイトなどご存知でしたらお押して頂けると幸いです。 -
>MSVCR90
おそらくマージモジュールが更新されているのが原因だと思います。VSにSPを当てたり、セキュリティアップデートを適用した後に出す初めてのアップデートではありませんか?先日もアップデートがあった気がします(.NET の更新に紛れてこっそりと...)。
こちらについては、メジャーアップグレードを選択している限り影響することはありません。変更があっても古いのは必要に応じて適宜撤去してくれるので。。。WiXのような融通の利くビルドツールを使っていれば回避策はあるかもしれませんが、VSセットアップではどうにもならない世界なはずなので。。。
>バージョン表記とインストーラで選択すべきアップグレード方法
はい。バージョンがいくつ上がるか?とアップデートの方式とは必ずしも一致しません。インストーラ的に破壊的更新(アップデータが作成できない更新)があるのなら、マイナーバージョンアップでも、msiで作成しメジャーアップグレードという選択をとります。逆に単純にいくつかのファイルの更新だけでなおかつ旧バージョンと同居している必要がなければメジャーバージョンが変わっていても、パッチ提供しても問題はありません(普通はマーケティング的な理由からやりませんがw)。
>マイナーアップグレード(マイナーアップデート)
マイナーアップグレードは本質的には明示的な提供方法ではなく、単にmspを作るための前段階でしかありません。
mspによる提供を可能にするには、必ずマイナーアップグレードできる必要があります。テスト中などでは毎回mspを作成してだと手間がかかるので、アプリケーションのテストなどは、マイナーアップグレードしてチェックしておき、その間にmspを作成したり、mspの適用テストを行ったり。。。ということをします。
基本的にはカスタムインストールとかがあるようなそれなりの規模の製品のアップデートを行うときにはじめて検討してもいいものだといえます。
わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/