适用于2个组件的WiX安装程序

问题描述 投票:2回答:1

完整的WiX新手已经完成了一项任务,并且不确定如何解决它或者是否可能。我所拥有的是两个可执行文件,它们将存在于供应商目录下的自己的文件夹中,如下所示:

C:\Program Files (x86)\My Company
 |
 +---Program A
 |    |
 |    +---config.txt
 |    +---program_A.exe
 |
 +---Program B
 |    |
 |    +---config.txt
 |    +---program_B.exe

程序A和程序B将始终打包在一起,并作为Windows服务安装。程序A可能比程序B更频繁地更新,当发生这种情况时,我需要程序B继续运行,因为它将程序A的状态报告回另一台机器。

我设法实现的是在同一个WiX文件中有两个组件,但很明显产品元素中只有一个升级代码,所以即使程序B没有变化,它们也会卸载然后重新安装。

我尝试了链接的路线(使用刻录)两个单独的MSI,但我被告知我们只能将产品分发为MSI而不是像刻录产品那样的exe。

是否有可能实现我想要的东西,如果是这样,我需要做什么来研究呢?

编辑我尝试创建两个模块并使用合并,但这似乎也不起作用。这是我的一个模块:

MergeModule1.wxs

<?xml version='1.0'?>

<?define version = "!(bind.fileVersion.Program1_Exe)"?>
<?define language = 1033?>
<?define company_name = "ABC Soft"?>
<?define codename = program1?>
<?define product_name = Program1?>
<?define full_product_name = '$(var.company_name) $(var.product_name)'?>
<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'
 xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">

<Module Id="MergeModule1ID" Language='$(var.language)' Version='$(var.version)'>

    <Package Id="3a281d57-33fd-4601-8aee-9e6349701b4b"
        Description='$(var.full_product_name)'
        Manufacturer='$(var.company_name)'
        InstallScope='perMachine'
        InstallerVersion='200'
        Comments='Version: $(var.version)'>
    </Package>

    <Directory Id='TARGETDIR' Name='SourceDir'>
        <Directory Id='ProgramFilesFolder' Name='PFiles'>
            <Directory Id='VendorDir' Name='$(var.company_name)'>
                <Directory Id='TheProgramDir' Name='$(var.product_name)'/>
            </Directory>
        </Directory>
    </Directory>

    <DirectoryRef Id="TheProgramDir">
        <Component Id='Program1_Exe' Guid='d6fdaf52-16aa-42f8-9790-4287510f53f5'>
            <File Id='Program1_Exe'
                Name='Program1.exe'
                Source='Program1.exe'
                KeyPath='yes' />

            <ServiceInstall Id='InstallService'
                Name='$(var.codename)'
                DisplayName='$(var.full_product_name)'
                Description='$(var.full_product_name)'
                Type='ownProcess'
                Vital='yes'
                Start='auto'
                ErrorControl='ignore'
                Interactive='no'>   

                <util:ServiceConfig
                    FirstFailureActionType="restart"
                    SecondFailureActionType="restart"
                    ThirdFailureActionType="restart"
                    ResetPeriodInDays="1"
                    RestartServiceDelayInSeconds="60" />
            </ServiceInstall>

            <ServiceControl Id='StartService'
                Start='install'
                Stop='both'
                Remove='uninstall'
                Wait='yes'
                Name='$(var.codename)' />
        </Component>
    </DirectoryRef>

</Module>

我还有一个MergeModule2.wxs,它包含对Program2 exe和不同GUID的相关更改。 Program1 exe版本为2.0.0.1,而Program2 exe版本为1.0.2.1,因此模块中的版本号相应地设置。在合并wix文件中,我有:

MergeInstallers.wxs

<?xml version='1.0' encoding='windows-1252'?>

<?define version = "0.1.0.0"?>
<?define language = 1033?>
<?define company_name = "ABC Soft"?>
<?define codename = program?>
<?define product_name = Program?>
<?define full_product_name = '$(var.company_name) $(var.product_name)'?>
<?define upgrade_code = eaf3891c-cd16-4239-b8bc-1b2cd7816c16?>

<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>

<Product Id='*'
  UpgradeCode='$(var.upgrade_code)'
  Name='$(var.full_product_name)'  
  Language='$(var.language)'
  Version='$(var.version)' 
  Manufacturer='$(var.company_name)'>

  <Package Description='$(var.full_product_name)'
      Manufacturer='$(var.company_name)'
      InstallScope='perMachine'
      InstallerVersion='200'
      Compressed='yes'
      Comments='Version: $(var.version)'>
  </Package>  

  <Upgrade Id='$(var.upgrade_code)'>

      <UpgradeVersion OnlyDetect='no' Property='NEWPRODUCTFOUND'
          Minimum='$(var.version)' IncludeMinimum='no'
          Language='$(var.language)' />
      <UpgradeVersion OnlyDetect='no' Property='OLDPRODUCTFOUND'
          Maximum='$(var.version)' IncludeMaximum='no'
          Language='$(var.language)' />
      <UpgradeVersion OnlyDetect='no' Property='CURRENTPRODUCTFOUND'
          Minimum='$(var.version)' IncludeMinimum='yes'
          Maximum='$(var.version)' IncludeMaximum='yes'
          Language='$(var.language)' />
  </Upgrade>

  <Media Id='1' Cabinet='$(var.codename).cab' EmbedCab='yes'></Media>

  <Directory Id='TARGETDIR' Name='SourceDir'>
      <Directory Id='ProgramFilesFolder' Name='PFiles'>
          <Directory Id='VendorDir' Name='$(var.company_name)'>
              <Merge Id="Mod1" Language='$(var.language)' SourceFile="Program1\MergeModule1.msm" DiskId="1" />
              <Merge Id="Mod2" Language='$(var.language)' SourceFile="Program2\MergeModule2.msm" DiskId="1" />
          </Directory>
      </Directory>
  </Directory>

  <Feature Id="Msm" Title="Msm" Level="1">
      <MergeRef Id="Mod1" />
      <MergeRef Id="Mod2" />
  </Feature>

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

</Product>

现在,在第一次安装msi时,安装了两个服务并运行正常。我现在对Program1.exe进行了更改,以便exe的版本从2.0.0.1更改为2.0.0.2,Program2.exe在1.0.2.1保持不变(随后,Program1的模块版本也将更改)。我重建了所有内容并运行了msi和重新安装的两个程序,并重新启动了两个服务。我期望发生的是Program1将因版本更改而被替换,而Program2将毫不犹豫地继续运行。我错过了一些明显的东西,还是我的逻辑?

wix windows-installer chaining
1个回答
1
投票

这非常简单。从本教程开始:

https://github.com/iswix-llc/iswix-tutorials

使用两个postbuild副本创建两个服务项目,并在合并模块中定义两个服务。

最后在Product.wxs的MajorUpgrade元素中添加Schedule="afterInstallExecute"

http://wixtoolset.org/documentation/manual/v3/xsd/wix/majorupgrade.html

这是重要的部分。您必须确保100%正确版本并构建服务。实际更改时只包含更新的EXE。如果版本未更改,MSI将不会重新安装该组件,因此该服务不会停止广告启动。如果版本已更改,则会升级组件,从而导致服务停止并作为升级的一部分启动。

© www.soinside.com 2019 - 2024. All rights reserved.