11.26.2013

インストールで必ず上書きしたい

久々に痛い目見たのでメモ。

InstallShieldで作ったインストーラでクリーンインストールは問題なくインストールできるが、バージョンアップで上書きインストールすると何故かテキストファイルが1つ上書きされず古いものが残ってしまうということが起こった。

テキストファイルなどはインストールした後にそのファイルを更新すると、次に上書きインストールしても上書きしないという動作がデフォルトのようだ。これは設定ファイルなどの場合、ユーザの設定が残されるので便利という機能らしい。その代わりReadmeなどインストールしたら常に新しくしたいファイルの場合は設定の変更が必要だ。

■ファイルとフォルダの設定で、インストールするファイルのプロパティの「常にオーバーライドする」というチェックをONにする。
と、そのファイルはファイルが更新されていても上書きされるようになる。 
(これは同じインストーラでの再インストール時の処理とは異なる。初回、再インストール関係無く、インストール時にファイルが既にあった場合の動作設定だ。再インストールにも問題があったのでこちらにまとめた

しかし更新されてたら上書きしないってのがデフォルトの設定というのにも疑問があるなぁ。
ユーザが設定を書込むような設定ファイルって少数派なんではないかな?と。Readmeとかはインストールされるだろうけど、ユーザが設定を書込むようなファイルってのは初回起動時にユーザディレクトリに作成されるとか、そいうアプリの方が多いんじゃないかな。


ここまで判明すれば後はチマチマと設定変更すれば良いだけなのだが…。
ここまで判明するまでも大変だったし、チマチマと設定変更するのも大変だったので以下は愚痴になる。

先ず、更新されたファイルは更新されない、と書いたが正確な仕様は、
「バージョン情報の無いファイルをインストールする場合、インストール先にファイルが既にある場合、そのファイルの作成日時と更新日時を比べて同じでなかった場合は更新されたファイルと判断し、上書きしない」というものだ。
いやまて「作成日時と更新日時が同じでない」なんて大半のファイルが当てはまると思うだろう。ところがその前にインストーラでインストールしたファイルの作成日時は更新日時と同じになる、という仕様がある。若干無理やりな感じがするし分かりずらかったんだが、これでインストールされてから更新されたファイル、という判断をしているらしい。
バージョン情報というのはexeやdllに付けられるバージョンリソースのことだろう。 バージョン情報がある場合は更新日時など見ないでバージョンの新しい方で上書きする。(バージョン情報のあるファイルの上書きの仕様については「Windows Installer サービスはどの様にして上書きを行いますか?」が詳しい。はっきり言って僕はこの仕様をきちんと理解していない。)

次に、「常にオーバーライドする」というチェックをONにしてインストーラをビルドしても上書きされないことがある。そんなばかな、と思ったのだが何度やっても上書きされなくて参った…。「簡単に直りますよ~」と報告した後に実はそう簡単に直らない問題でしたというのは一番やなパターンなんですよ。
これはどうやって直ったかというと、「InstallShieldを再起動」。「InstallShield 12」というバージョンを使う場合に忘れてはならないことだが、InstallShieldはしばしば言うことを聞かないし設定が効かない。不可逆な操作が多いのでマウス操作には慎重に。つか新しいの買ってよぉ。
(保存しても設定が効かないことがあるので変だと思ったら再起動してビルドしてみる、というのはものすごく重要なTipsだ)(再起動してみると設定したはずのプロパティ等が無い!ということもあるので確認してからビルドだ)

0 件のコメント:

コメントを投稿