2016-04-04 10 views
0

私たちは製品のmsiを作成するためにwix 3.9を使用します。私たちの目標:msiで設定ファイル(.txt-file)を配信したい。設定ファイルがインストールフォルダにすでに存在する場合、そのファイルはアップグレードによって上書きされません。残念ながら、Wixはアップグレード時に設定ファイルを削除します。設定ファイルをMajorUpgradeに保存するにはどうしたらいいですか?

製品要素:

<Product Id="*" Name="$(var.AppName) V$(var.Version) $(var.TargetBuild)" Language="1033" Version="$(var.Version)" Manufacturer="$(var.Manufacturer)" UpgradeCode="$(var.UpgradeCode)"> 

$(var.UpgradeCode)は静的であり、変更されることはありません。

アップグレードタグ:

<Component Id="ConfigComponent" NeverOverwrite="yes" Guid="GUID-HERE"> 
    <File Id="ConfigOutput" KeyPath="yes" Name="MyConfig.config" Source="MyConfig.config.bak"/> 
</Component> 

はまた、私は、アプリケーション自体によって生成されたファイルを削除するためにRemoveFolderEx使用:

<MajorUpgrade DowngradeErrorMessage="A newer version of $(var.AppName) is already installed." AllowSameVersionUpgrades="yes" /> 

<Upgrade Id="$(var.UpgradeCode)"> 
    <UpgradeVersion Minimum="1.0.0" 
        IncludeMinimum="yes" 
        OnlyDetect="yes" 
        Maximum="$(var.Version)" 
        IncludeMaximum="yes" 
        Property="PREVIOUSVERSIONSINSTALLED" /> 
</Upgrade> 

<Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" /> 

は、ここで設定ファイルです。しかし、私がこのブロックをコメントアウトしても、問題はまだ発生します。しかし、私は完全のためにコードブロックを表示したい:

<Component Id="RemoveAll" Guid="MYGUID"> 
    <RemoveFile Id="RemoveAllFilesOnUninstall" Directory="APPLICATIONFOLDER" Name="*.*" On="uninstall" /> 
    <RemoveFolder Id="RemoveAllFoldersOnUninstall" Directory="APPLICATIONFOLDER" On="uninstall" /> 

    <RegistryValue Root="HKLM" Key="SOFTWARE\$(var.Manufacturer)\$(var.AppName)" Name="Path" Type="string" Value="[APPLICATIONFOLDER]" KeyPath="yes" /> 
    <util:RemoveFolderEx On="uninstall" Property="APPLICATIONFOLDER" /> 
</Component> 

リプロ:まず、我々はソフトウェアをインストールし、期待通りにファイル「MyConfig.config」とは、アプリケーションフォルダに表示されます。その後、この設定ファイルの内容を変更します。次に、2番目の.msiファイルを作成して実行します。更新が行われると、すべてのファイルが期待どおりに上書きされます。しかし、私たちは今、インストールフォルダに 'MyConfig.config'というファイルがありません。

UPDATE:予想通り

属性Permanent="yes"も動作しません。設定ファイルは、まだアップグレード時に削除されます。

あなたのメジャーアップグレード時に何が起こっている
<Component Id="ConfigComponent" Permanent="yes" NeverOverwrite="yes" Guid="GUID-HERE"> 
    <File Id="ConfigOutput" KeyPath="yes" Name="MyConfig.config" Source="MyConfig.config.bak"/> 
</Component> 

答えて

0

  1. CostInitialize/CostFinalizeのアクションは、新しいMSIのどのコンポーネントをインストールする必要があります決定します。 ConfigComponentは、NeverOverwrite = "yes"とマークされているため、インストールしないことを決定します。
  2. RemoveExistingProductsアクション中に古いMSIが削除されます。以前の設定ファイルは削除されます。
  3. 新しいMSIがインストールされています。 =

    は今後、永久にあなたのConfigComponentをマーク:ConfigComponentは、ステップ1からチェック

迅速な解決策(私はより良いアプローチがそこにあると確信しているが)に基づいてインストールされませんMSIが決してそれを削除しないように "はい"。ファイルを削除するカスタムアクションを追加し、 "$ ConfigComponent = 2 And Not UPGRADINGPRODUCTCODE"に条件を設定して、コンポーネントが変更または完全アンインストールで削除されるように設定されている場合にのみ実行するようにします。アップグレード。

MSIがすでに出荷されており、アップグレードシナリオを修正する必要がある場合は、古いMSIが削除する前に設定ファイルをバックアップ場所にコピーするカスタムアクションを作成する必要があります。その後、別のカスタムアクションを実行して、設定ファイルを正しいディレクトリにコピーします。

+0

これはWindowsインストーラ自体に問題があるように見える、このリンクをお読みください。 https://community.flexerasoftware.com/showthread.php?96157-The-truth-the-whole-truth-about-quot-をNever-overwrite-quot-and-quot-Permanent-quot-files – Isaiah4110

+0

このファイルが不足しているこの問題は、RemoveExistingProductsのスケジュール方法によるものです。 REPをInstallFinalizeの直前に移動すると、この問題は解決しますが、その変更には他の考慮事項が必要です - https://msdn.microsoft.com/en-us/library/windows/desktop/aa371197%28v=vs。 85%29.aspx – jbudreau

+0

@jbudreau:手順2について:msiが以前の設定ファイルを削除するのはなぜですか?以前のインストールでは、属性NeverOverwrite = "yes"も含まれています。そのため、私はconfigファイルが削除されないことを期待しています。 – Simon

関連する問題