11

MajorUpgrade、ServiceControl、.config ファイルをうまく連携させるのに苦労しています。 私の他の質問の後、私は今また反対の問題を抱えています。

以前は、AssemblyFileVersions が静的だったためにファイルが上書きされていなかったので、修正しました。 1)現在、既存のファイルの変更日がファイルの作成日とは異なり、キーパスとして設定されていてもSchedule="afterInstallExecute"KeyPath='yes' .configファイルはまだ上書きされています。現在、 .configファイルを上書きして、インストール後にサービスを再起動する必要があります。

2)それを修正しても、再起動を回避するという問題がまだあります。私がそう言うならSchedule="afterInstallInitialize"、.config ファイルは確実にサービスと共に削除されるのが早すぎると思います。私が言うとSchedule="afterInstallExecute"、サービスは停止せず、インストール後に再起動が必要です。(そうですよね?) インストールの前にサービスを手動で停止すると、再起動を回避できます。カスタム アクションを追加するとnet stop、私が推測するものを置き換えることができますServiceControlが、すべての条件を正しく設定するのは複雑に思えます。

3)おまけとして、アップグレード中にサービスを削除したくありません。サービスを停止し、バイナリを置き換えて、サービスを再開することはできますか? これにより、アップグレードのためにサービス アカウントの資格情報を再入力する必要がなくなります。ただし、もちろん、最初のインストール時にインストールし、機能の削除時にアンインストールする必要があります。

これがその要点です(何らかの問題が発生した場合に備えて、後でバンドルされます):

<MajorUpgrade DowngradeErrorMessage="A newer version is already installed." 
              Schedule="afterInstallExecute" />

<ComponentGroup Id="ServiceCG">
    <Component Id="Service" Guid='*' Win64='yes' Directory='INSTALLDIR'>
        <File Id='ServiceEXE' Source='$(var.root)Service.exe' />
        <ServiceInstall Id="ServiceInstall"
                          Name="MyService"
                          DisplayName="My Server"
                          Type="ownProcess"
                          Start="auto"
                          ErrorControl="normal"
                          Description="My Server Service"
                          Interactive="no"
                          Account="[...]"
                          Password="[...]" />
        <ServiceControl Id="StopService" Name="MyService" Start="install" 
                        Stop="uninstall" Wait="yes" Remove="both" />
        <util:User Id="UpdateServiceAccountLogonAsService" UpdateIfExists="yes"
                   CreateUser="no" Name="[SERVICEACCOUNTFULL]" 
                   LogonAsService="yes"/>
    </Component>
    <Component Id="ServiceConfig" Guid='*' Win64='yes' Directory='INSTALLDIR'>
        <File Id='FileServiceConfig' KeyPath='yes' 
              Source='$(var.root)Service.exe.config' />
    </Component>
</ComponentGroup>

関連するが未回答:

WiX バージョン 3.8.1128.0

4

2 に答える 2

5

編集:同じ問題、または少なくとも同じトピックに関するこの説明は、理解しやすいようです: Msiexec: インストール失敗時に以前のバージョンに自動ロールバック


ここで、いくつかのコア MSI 使用の問題に頭を悩ませています。

  1. ファイルのバージョン管理: インストール中、デフォルトのファイル上書きモード ( REINSTALLMODE プロパティで定義) は、デフォルトでは同じバージョンのファイルを置き換えません。これは、REINSTALLMODE = "emus" を設定することで変更できます。これにより、バージョン管理されたファイルと同じバージョンのファイルが置き換えられます。変更日と作成日が異なる場合、バージョン管理されていないファイルは保持されます。
  2. アップグレードの動作: Chris が言うように、デフォルトに戻されたように見えるファイルは、メジャー アップグレードの構成により、実際にはアンインストールされ、再インストールされます。ファイルの保存は、RemoveExistingProducts が InstallExecuteSequence の後半に配置されている場合にのみ、メジャー アップグレードで可能です。その後、リリース間の共有ファイルはアンインストールされず、ポイント 1 で説明したファイルのバージョン管理ルールが上書きに適用されます。
  3. サービス構成の保持: サービス資格情報の再入力を回避することは、InstallExecuteSequence の早い段階でアンインストールするメジャー アップグレードの一般的な問題です。つまり、製品がアンインストールされてから再インストールされ、変更されたファイルが消去されます。私はそれをお勧めしませんが、一部の人々はこの解決策を主張しています: wix のメジャー アップグレード時に Windows サービスのみを停止してアンインストールしない方法は? ロブ・メンシングは WIX と Orca の作成者です。彼はこのソリューションをオプションとして提案していると思いますが、必ずしも推奨するものではありません。リンク先の投稿で確認してください)。正しいコンポーネント参照とアンインストールを InstallExecuteSequence の後半に配置すると、通常、この問題は完全に回避され、これが推奨されるアプローチです (通常のコンポーネント参照により、コンポーネントが完全にアンインストールされず、サービス設定と変更された構成ファイルがそのまま残ります。コンポーネントの参照は正しいです - 以下のこの概念の説明を参照してください)。ただし、ユーザー アカウントを使用してサービスを実行している場合は、サービスのインストールと構成に別の MSI を使用することをお勧めします。- その後、それは自己完結型の展開ユニットであり、ブートストラップに含めることができ、それ自体で更新できます。何よりも、他のアプリケーションの変更やホットフィックスに影響されません。最後に、ユーザー アカウントを使用してサービスを実行することは、セキュリティと展開の両方の理由から、最初から推奨される方法ではないことを指摘しておきます。

コンポーネント参照: MSI コンポーネントに割り当てられた GUID を参照し、すべてのアップグレードを通じて常に 1 つだけの (絶対) パスと一致する必要があることを示します。ここでいくつかの例を使用して、これに関するより良い議論を参照してください: wix でコンポーネントの GUID を変更しますか?

サービスをインストールする MSI コンポーネントを永続的に設定してアンインストール時に削除されないようにするオプションについては言及しませんでした。その後、最終的なアンインストール時にファイルと登録が残り、クリーンアップするためのカスタム アクションが必要になります。非常に悪い習慣であり、多くの余分な作業とぶら下がっているコンポーネント参照の問題を引き起こします。

于 2014-05-08T16:43:23.397 に答える
4

The file create/mod rule only applies to install/reinstall a component. It doesn't prevent the component from being uninstalled. Your major upgrade is scheduled very early which means the previous version is completely uninstalled and then then the new version is installed. This is why your file is overwriting when you don't expect it to. Schedule RemoveExistingProducts later to avoid this problem.

Set your Stop attribute to both install and uninstall. Those two changes should solve your problems.

于 2014-05-08T13:33:43.530 に答える