完整的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将毫不犹豫地继续运行。我错过了一些明显的东西,还是我的逻辑?
这非常简单。从本教程开始:
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将不会重新安装该组件,因此该服务不会停止广告启动。如果版本已更改,则会升级组件,从而导致服务停止并作为升级的一部分启动。