2017-10-13 20 views
0

私はWiX 3.8(最新の安定版リリース)を使用していますが、設定ファイルをにできないようです。アンインストールしてから再インストールしてください大幅なアップグレード。メジャーアップグレード中に設定ファイルの状態を維持する

これに関する多くの質問がありますので、多くの回答はthisサイトを肯定的に指しています。しかし、与えられた提案は(私のために)うまくいきません。

サイトで言うことは、各設定ファイルを独自のコンポーネントに配置し、そのファイルをコンポーネントのキーパスとしてマークすることです。このようなもの:

<Component Id="config.xml" 
      Guid="*" 
      Directory="folder_where_config_file_lives"> 
     <File Id="config_file" 
       Source="$(var.Project.ProjectDir)bin\Release\configFile.xml" 
       KeyPath="yes"/> 
    </Component> 

素晴らしい。

The InstallExecuteSequence table contains an action 'RemoveExistingProducts' that is declared in two different locations. Please remove one of the actions or set the Overridable='yes' attribute on one of their elements.

This personも、その問題を持っていた:

<InstallExecuteSequence> 
    <RemoveExistingProducts After="InstallFiles"/> 
</InstallExecuteSequence> 

問題私は、コンパイル時に、私はこのエラーを取得するには、次のとおりですので、は次のように次にそれは、INSTALLFILESアクションの後RemoveExistingProductをスケジュールすると言います彼はそれを解決したようだ。彼は効果的に「2つの異なる場所」宣言の問題を処分したのスケジューリング属性を、追加されたためにそれを固定何(私は推測):

​​

だから私は(スケジュール変更属性に置き換えたときにどの属性を含んでいます)、それはうまくいかないだけでなく、アップグレード中に設定ファイルが削除されて置き換えられます。私のプロジェクトには多くのMSIを持つブートストラップがありますが、設定ファイルが入っているMSIの後ろにあるすべてのMSIのインストール用のログファイルがありますが、インストールされていません。

これを繰り返してください:ログには、MSIがインストールされていると表示されますが、MSIはインストールされていません。ログファイルで見つけられないようなロールバックがありますが、インストールのように見えるMSIログファイルを読むとswimminlyになります。

への設定ファイルの方法を知っている人はいませんか?は、Wix 3.8のメジャーアップグレード時に削除して再インストールする必要はありませんか?私が上で述べたことは、私が見つけることができるウェブサイトからの最高の情報ですが、私はほとんど役に立たないので、ほとんどすべてを試しました。

答えて

2

MajorUpgrade要素には、RemoveExistingProductsアクションがスケジュールされている場所を含め、必要なものがすべて含まれています。 RemoveExistingProductsをシーケンスに追加しないでください。

RemoveExistingProductsはInstallFilesの後にあってはなりません。それがどこから来るかは明らかではないが、ドキュメントはそれは選択だと言うしません:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa371197(v=vs.85).aspx

RemoveExistingProductsのが早い(例えばInstallInitializeやInstallValidate後など)、配列決定された場合、それはあなたが効果的に古いものをアンインストールしていることを意味しそれに続いて新しい製品のアップグレードがインストールされます。これは、設定ファイルをアンインストールしてアップグレードにインストールすることを意味します。設定ファイルを保持する方法は、REP afterInstallExecuteをスケジュールすることです。これにより、基本的に古い製品と新しい製品のバージョンルールインストールがアップグレードされます。バージョンルールは、更新されたバイナリが必要な場合、ファイルバージョンを更新する必要があることを意味します。データファイル(configファイル)についての良いニュースが更新されたデータファイルは置き換えられませんされていること:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa370531(v=vs.85).aspx

古い製品は、その後のファイルの結果セットを保持、アンインストールします。

したがって、MajorUpgradeのREP afterInstallExecuteのシーケンスは、あなたが望むものと思われます。 WiXに自動生成されたguidがあれば自動的に起こるコンポーネントルールに従わなければならないという警告があります。

+0

ハレルヤ!あなたの提案はうまくいきます!あなたが与えたこれらのリンク... MSDNは、読者が多くの用語を理解していると仮定しているようです。 「赤ちゃんの頭の中に落とされた人のためのWindowsインストーラー」がありますか教えてください。私はORCAを持っているので、シーケンスを見ることができますが、このものを最初から学ぶ場所は見つけられませんでした(Nick Ramirez教科書、noobの偉大さ、奥深くまでカバーしていない本当に開発する必要があります)。あなたはどこでこれを学びましたか? (Snarkyの答えがうまく受け入れられました) – Bob

+0

Windowsインストーラの定型的なガイドを入手できるかどうかを確認してください。 – PhilDW

+0

私はします。ありがとうございました。 – Bob

0

IMO、WindowsインストーラーはXMLが捕捉される前に発明されたものであり、コンポーネントルールはそれをうまく処理しません。私がやりたいことは、この行動と戦わないことです。 1つの設定ファイルがインストーラによって所有され、常に安全に上書きできるようにアプリケーションを作成し、ユーザー設定データを保持し、MSIが認識しない別の設定ファイル。この2番目のファイルは、最初のファイルを上書きする必要があります。

+0

提案に感謝します。 PhilDWの答えはうまくいくようですが、長期的にはそうではないかもしれませんが、私はあなたの提案に従ってしまうかもしれません(私はCanon WiXを手に入れることができなかったため、作業するソリューション)。しかし、あなたの提案は私に質問を残します:MSIはファイルについてどのように "知らない"ことができますか?私はあなたのポストで少し拡大するように頼んでいると思います。それはできますか? – Bob

+0

アプリケーションまたはMSIによって作成されたカスタムアクションで作成されたファイル。 –

+0

これを考えてみましょう。あなたの設定にビルド1でいくつかのキーバリューペアがあったとしましょう。ユーザーがこれらの値のいずれかを何かに設定するとします。新しいビルドでは、追加のキー値ペアが追加されました。アップグレード中にインストーラは何をすべきですか?新しいKVPを上書きして取得しますが、ユーザデータを失うか、上書きしてユーザデータを保存しませんが、新しいKVPは取得しませんか?デルタを収穫し、ファイルを置き換えて再適用する複雑なカスタムアクションを記述することができます。または、2つのファイルにデータを格納することで問題を完全に排除できます。理にかなっている? –

関連する問題