他の機能をアンインストール/アップグレードすることなく、WIX機能ツリーの個々の機能をアップグレードする
-
20-09-2019 - |
質問
使用してセットアッププロジェクトを作成しようとしています wix これにより、単一の製品の複数の機能をインストールできます。機能ツリーの他の機能を再インストールすることなく、インストールされている機能の1つ(他のインストールされた機能とは独立しています)を更新するにはどうすればよいですか?
たとえば、Hellowolrdと呼ばれるプロジェクト(Hellowolrdに戻る)を持ちたいと思っています。画面上。これらのHello Worldアプリケーションのうち3つ、Hello World 1、Hello World 2、およびHello World 3を持っているとしましょう。私が希望するのは、デフォルトでこれらの3つの「機能」すべてをすべてインストールするが、後で各機能を個別にアップグレードすることもできるMSIを作成することです。
これが私のソリューションのレイアウトです:
ソリューションエクスプローラーhttp://img12.imageshack.us/img12/5671/solutionexplorerm.jpg
私のwix product.wxsファイルは次のようになります:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="ca484210-c719-4b2e-b960-45212d407c11" Name="HelloWorldInstaller" Language="1033" Version="1.0.0.0" Manufacturer="HelloWorldInstaller" UpgradeCode="68eeb8cb-9ef3-443c-870c-9b406129f7ff">
<Package InstallerVersion="200" Compressed="yes" />
<Media Id="1" Cabinet="media1.cab" EmbedCab="yes" />
<!-- Create Directory Structure -->
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLLOCATION" Name="Hello World" />
</Directory>
<Directory Id="DesktopFolder" Name="Desktop"/>
</Directory>
<DirectoryRef Id="INSTALLLOCATION">
<Component Id="HelloWorld1" Guid="6D1D9D33-DA17-4db3-8132-C39F32200C3A">
<RegistryKey Root="HKCU" Key="Software\HelloWorldInstaller\HelloWorld1\Install" Action="createAndRemoveOnUninstall">
<RegistryValue Name="DTSC" Value="1" Type="integer" KeyPath="yes" />
</RegistryKey>
<File Id="HelloWorld1.exe" Name="$(var.HelloWorld1.TargetFileName)" Source="$(var.HelloWorld1.TargetPath)" DiskId="1" Checksum="yes">
<Shortcut Id="HelloWorld1ApplicationDesktopShortcut" Name="Hello World 1" Description="Hello World Application 1" Directory="DesktopFolder" WorkingDirectory="INSTALLLOCATION" />
</File>
</Component>
<Component Id="HelloWorld2" Guid="B2D51F85-358B-41a7-8C45-B4BB341158F8">
<RegistryKey Root="HKCU" Key="Software\HelloWorldInstaller\HelloWorld2\Install" Action="createAndRemoveOnUninstall">
<RegistryValue Name="DTSC" Value="1" Type="integer" KeyPath="yes" />
</RegistryKey>
<File Id="HelloWorld2.exe" Name="$(var.HelloWorld2.TargetFileName)" Source="$(var.HelloWorld2.TargetPath)" DiskId="1" Checksum="yes">
<Shortcut Id="HelloWorld2ApplicationDesktopShortcut" Name="Hello World 2" Description="Hello World Application 2" Directory="DesktopFolder" WorkingDirectory="INSTALLLOCATION" />
</File>
</Component>
<Component Id="HelloWorld3" Guid="A550223E-792F-4169-90A3-574D4240F3C4">
<RegistryKey Root="HKCU" Key="Software\HelloWorldInstaller\HelloWorld3\Install" Action="createAndRemoveOnUninstall">
<RegistryValue Name="DTSC" Value="1" Type="integer" KeyPath="yes" />
</RegistryKey>
<File Id="HelloWorld3.exe" Name="$(var.HelloWorld3.TargetFileName)" Source="$(var.HelloWorld3.TargetPath)" DiskId="1" Checksum="yes">
<Shortcut Id="HelloWorld3ApplicationDesktopShortcut" Name="Hello World 3" Description="Hello World Application 3" Directory="DesktopFolder" WorkingDirectory="INSTALLLOCATION" />
</File>
</Component>
</DirectoryRef>
<Feature Id="HelloWorld1Feature" Title="Hello World 1" Level="1">
<ComponentRef Id="HelloWorld1"/>
</Feature>
<Feature Id="HelloWorld2Feature" Title="Hello World 2" Level="1">
<ComponentRef Id="HelloWorld2"/>
</Feature>
<Feature Id="HelloWorld3Feature" Title="Hello World 3" Level="1">
<ComponentRef Id="HelloWorld3"/>
</Feature>
</Product>
</Wix>
これで、これが構築されると、予想どおり機能がインストールされます。ただし、HelloWorld1.VBに変更を加えて再コンパイルする場合、すべてではなく、その機能のみを再インストール(アップグレード)できるようにしたいと思います。
1つのファイルを更新してソリューションを再構築すると、MSIをインストールしてみてください。このエラーが表示されます。
MSIエラーhttp://img696.imageshack.us/img696/849/anotherversionisInstall.jpg
コードを更新して、機能のアンインストールを許可し、アップグレードコードの使用を許可しましたが、それがすべての機能をアンインストールし、それらすべてを再インストールしました。
- 実際のアプリケーション -
これへのReal Worldアプリケーションは、サービス/スケジュールされたタスクとして定期的に実行される複数のサポートアプリケーションを必要とする大規模なソフトウェアパッケージです。これらのサポートアプリを1つのMSIにインストールして、各Exeを個別に展開するような悪夢を持たないようにしたいと思います。 Exeの1つに更新がある場合、そのexeを手動でコンパイルしてロールアウトできることを知っていますが、完全に再現可能な方法でこれを行いたいと思います。
どんなヘルプも適用されます、
ありがとうございました!
編集:
ダウンロードのソースを追加しました Googleコード. 。再度、感謝します!
解決
私はこれを理解し、他の人のための将来の参照のためにここに答えを投稿すると思った。それで、私は問題を完全に説明しました、私は現実世界のシナリオのより深い深さに進みます。
中程度に大きなソフトウェアがあり、多くの異なるサーバーで実行される複数のサポートアプリケーションを必要とする必要があります。現在のアップグレードの進行により、信頼できる方法でコードをアップグレードすることは適度に困難です。現在、自己抽出exeを使用して、さまざまなサーバーにコードを展開しています。問題は、多数のサポートアプリケーションがある場合に発生し、アプリケーションが正しい構成設定などで正しくインストールされていることを確認するのが難しくなります。サポートアプリケーションでは、インフラストラクチャチームが特定のサポートアプリケーションセットを各指定機にインストールできるようにする単一のインストーラー(MSI)を作成します。大きな変更がある場合(たとえば1.0から2.0の場合)、完全なアップグレードインストールを行います(すべてのサービス/プロセスを停止、インストール、インストール、および開始する必要があります)。他のアプリケーションに触れることなく、影響を受けるサービス/プロセスを停止および再インストールするだけで済みます。さて、私のとりとめのない、 ソリューション:
シナリオでは実際には不要なため、ショートカットを削除するためにWIX製品を変更しました。これが更新されたWXSファイルです:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="13C373D3-5C27-487e-A020-C2C89E4607B1" Name="HelloWorldInstaller" Language="1033" Version="1.0.0.0"
Manufacturer="HelloWorldInstaller" UpgradeCode="E7CB3C76-4D51-48a8-BFB4-6D11B2E2E65B">
<Package InstallerVersion="200" Compressed="yes" />
<Media Id="1" Cabinet="product.cab" EmbedCab="yes" />
<FeatureRef Id="HelloWorld1Feature" />
<FeatureRef Id="HelloWorld2Feature" />
<FeatureRef Id="HelloWorld3Feature" />
</Product>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLLOCATION" Name="Hello World" />
</Directory>
<Directory Id="DesktopFolder" Name="Desktop"/>
</Directory>
</Fragment>
<Fragment>
<DirectoryRef Id="INSTALLLOCATION">
<Directory Id="HelloWorld1Directory" Name="Hello World 1">
<Component Id="HelloWorld1Component" Guid="6D1D9D33-DA17-4db3-8132-C39F32200C3A">
<File Id="HelloWorld1.exe" Name="HelloWorld1.exe" Source="HelloWorld1.exe" DiskId="1" Checksum="yes" />
</Component>
</Directory>
<Directory Id="HelloWorld2Directory" Name="Hello World 2">
<Component Id="HelloWorld2Component" Guid="B2D51F85-358B-41a7-8C45-B4BB341158F8">
<File Id="HelloWorld2.exe" Name="HelloWorld2.exe" Source="HelloWorld2.exe" DiskId="1" Checksum="yes" />
</Component>
</Directory>
<Directory Id="HelloWorld3Directory" Name="Hello World 3">
<Component Id="HelloWorld3Component" Guid="A550223E-792F-4169-90A3-574D4240F3C4">
<File Id="HelloWorld3.exe" Name="HelloWorld3.exe" Source="HelloWorld3.exe" DiskId="1" Checksum="yes" />
</Component>
</Directory>
</DirectoryRef>
</Fragment>
<Fragment>
<Feature Id="HelloWorld1Feature" Title="Hello World 1" Level="1">
<ComponentRef Id="HelloWorld1Component"/>
</Feature>
</Fragment>
<Fragment>
<Feature Id="HelloWorld2Feature" Title="Hello World 2" Level="1">
<ComponentRef Id="HelloWorld2Component"/>
</Feature>
</Fragment>
<Fragment>
<Feature Id="HelloWorld3Feature" Title="Hello World 3" Level="1">
<ComponentRef Id="HelloWorld3Component"/>
</Feature>
</Fragment>
</Wix>
これに加えて、マイナーなアップグレードのために、コンポーネントのパッチのリリースを検討します。
たとえば、1,2、および3の3つのコンポーネントがあるProductaがあるとしましょう。これらの3つのコンポーネントは、サービスとして、またはスケジュールされたタスクとして実行する必要があります。当社の製品の性質は、すべてのサービスをシャットダウンして、コンポーネントの1つを更新または修正することはできません。したがって、バージョン1.0をインストールした後、コンポーネント2にバグが見つかったが、このバグに適用される修正によって1または3が影響を受けることを望まない場合、コンポーネント2のパッチをリリースします。したがって、コンポーネント2のみが影響を受けます。
上記の簡単な例では、ソフトウェアアプリケーションの3つのコンポーネントとしてHelloWorld1、HelloWorld2、およびHelloWorld3を使用しています。考えられるのは、1つのMSIで3つすべてをインストールできるようにする必要があるが、それぞれが他のインストールされたコンポーネントに影響を与えることなく独立して更新できるということです。
したがって、これを実証するために、「Hello World 1!」、「Hello World 2!」、および「Hello World 3!」を表示する上記の3つのコンソールアプリケーションを作成しました。その後、最初のMSIをリリースした後、HelloWorld1に「Hello World 1!更新」と言う必要がある「バグ」を見つけたとしましょう。代わりは。これをシミュレートするために私たちが行うことは次のとおりです。
- Commandプロンプトでこのコマンドを実行して、製品を作成します。
candle.exe Product.wxs
Candle.exeまたはWIXコマンドのいずれかを呼び出すには、WIXインストールディレクトリがパス変数にある必要があることを忘れないでください。 (パス環境変数の更新に関する短いチュートリアル)また、directoryのコマンドをdirectory.wxsファイルと同じように実行してください。 - 製品の最初のバージョンを作成します(1.0としましょう):
light.exe Product.wixobj -out ProductA-1.0.msi
- ここでバグを見つけます(Helloworld1の出力を変更して、「Hello World 1!更新」と言う)) アセンブリバージョンとファイルバージョンを更新します. 。これは重要です。これは、WIXがEXEが異なっていると言う方法だからです。
- ステップ1と同じコマンドを実行します(適切な尺度):
candle.exe Product.wxs
- ステップ2とほぼ同じコマンドを実行します。
light.exe Product.wixobj -out ProductA-1.1.msi
これは1.0ではなくバージョン1.1であることに注意してください(これは更新されたコードを備えたMSIです)。ただし、これをインストールするだけではありません。 読み続けます。 - これが楽しい部分です、次のコマンドで2つのMSISの違いが得られます。
torch.exe -p -xi ProductA-1.0.wixpdb ProductA-1.1.wixpdb -out Diff.WixMst
- 次に、これからパッチファイルを作成します(patch.wxsについて以下に説明します):
candle.exe Patch.wxs
- 次のコマンドでWIXMSPファイルを作成します。
light.exe Patch.wixobj -out Patch.WixMsp
- そして今、楽しい部分。このコマンドでMSPファイルを作成します。
pyro.exe Patch.WixMsp -out Patch.msp -t RTM Diff.Wixmst
さて、すべてが計画に従って進んだ場合、2つのMSIと1つのMSPファイルが必要です。最初のMSI(ProductA-1.0.MSI)をインストールし、HelloWorld1.exeを実行すると、「Hello World 1!」というメッセージが表示されます。楽しみ(および例)のためだけに、他のアプリケーションの両方を実行して実行したままにします(私はそれらを開いたままにしておくために停止しました)。 helloworld1.exeを閉じて、そのexeにアップデートを適用するようになりますが、そうすることでHelloworld2.exeまたはhelloworld3.exeには影響しません。 MSP(patch.msp)ファイルをインストールし、Helloworld1.exeを実行すると、更新されたメッセージ「Hello World 1!updated」が表示されます。
今、 魔法の patch.wxsファイル:
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Patch
AllowRemoval="yes"
Manufacturer="Dynamo Corp"
MoreInfoURL="http://www.dynamocorp.com/"
DisplayName="Sample Patch"
Description="Small Update Patch"
Classification="Update"
>
<Media Id="5000" Cabinet="RTM.cab">
<PatchBaseline Id="RTM"/>
</Media>
<PatchFamilyRef Id="SamplePatchFamily"/>
</Patch>
<Fragment>
<PatchFamily Id='SamplePatchFamily' Version='1.0.0' Supersede='yes'>
<ComponentRef Id="HelloWorld1Component"/>
</PatchFamily>
</Fragment>
</Wix>
あまり見えませんか?まあ、最も興味深い部分はこれらです:
<PatchBaseline Id="RTM"/>
- これは、パッチMSIの作成に使用されることを思い出す場合。 「RTM」は、上記の最後のステップで言及されています。-t RTM
- これらは一致する必要があります。<ComponentRef Id="HelloWorld1Component"/>
-これにより、パッチは正しいコンポーネントに向けて更新します。
検索を行っている場合、上記のコードはから馴染みがあるように見えるかもしれません ピーター・マルクのブログ: WIX:新しいパッチビルディングシステムを使用してパッチの構築-3パート3
私も大きく依存していました アレックス・シェフチュクのブログ: MSIからWixへ、パート8-メジャーアップグレード
「うわー、それは多くのステップだ、なぜ誰もがこの多くの手順を実行するのか」と思っているなら、ハードワーク(上記)が完了したら、これを統合ルーチンに移動する必要があることを覚えておいてください。それは正しい、統合、統合、 統合!これどうやってやるの?まあ、それはもう少し研究であり、多分ブログ投稿ですか? - おそらく。右足であなたを降ろすために、ここに素晴らしい記事があります MSBuildおよびWindowsインストーラーXMLでリリースを自動化します.
うわー、私はあなたがこのすべて(あなたの二人全員)を読んで、多くを学んだことを願っています。これが自分以外の誰かに役立つことを願っています。
ありがとうございました!
他のヒント
アップグレードシナリオを理解したように聞こえますが、今は理解する必要があります 主要なMSIアップグレードに削除されたプロダクトを配置する場所 そのため、機能が変更されていない場合、機能は再インストールされていません:)