WiX:有条件安装服务,但无条件安装文件
在Windows安装XML工具集中,要安装服务,我们将<ServiceInstall>
与<File>
组合为<Component>
。要有条件地安装该服务,我们将<Condition>
置于<Component>
之下。但是,如果条件为false,则该文件也不会被安装。如果我将<File>
置于无条件<Component>
中,则该服务没有可执行文件路径,因此安装将失败。如果我将<File>
都放在<Component>
中,则会找到重复的符号。WiX:有条件安装服务,但无条件安装文件
问题是,我们可以有条件地安装服务,但无条件安装相关的可执行文件吗?
谢谢!
使用不同的GUID和Ids'以及互斥条件创建两个组件:一个用于文件和服务,另一个用于文件。类似这样的:
<Component Id="SvcComp" Guid="{YOUR-GUID}" SharedDllRefCount="yes">
<Condition> SOME_CONDITION </Condition>
<File Id="SvcFile" Name="Service.exe" Source="Service.exe" Vital="yes" />
<ServiceInstall Id="Svc" Name="Service" DisplayName="Service" Description="Service" Type="ownProcess" Start="auto" ErrorControl="normal" Vital="yes" />
<ServiceControl Id="Svc" Name="Service" Stop="both" Remove="uninstall" Wait="yes" />
</Component>
<Component Id="ExeComp" Guid="{YYOUR-GUID}" SharedDllRefCount="yes" >
<Condition> NOT SOME_CONDITION </Condition>
<File Id="ExeFile" Name="Service.exe" Source="Service.exe" Vital="yes" />
</Component>
您将得到一个LGHT1076警告,因为组件中的条件是互斥的,所以可能会被禁止。
感谢您的建议,我发现我错过的是文件ID。使用不同的Id但名称相同,相同的文件可以存在于不同的'
技术上可行,但你会得到ICE验证错误,因为这两个组件具有相同的键路径。这不是一个干净的解决方案。 – 2013-02-12 17:23:46
我一直在走这条路,它会变得复杂得更快,然后会有人期待。
我认为有两个组件(尽管它们是互斥的条件表达式)具有相同的密钥文件,但不同的ServiceInstall/Control资源违反了组件规则。
我建议这样做的方法是将所有的业务逻辑转移到一个独立的DLL组件中,并创建两个不同的EXE组件。将其中一个设置为控制台/ Windows应用程序,另一个设置为服务应用程序。将组件关联到两个不同的功能,以便最终用户可以决定他想要配置应用程序的方式。然后用户可以在添加/删除程序中进行修改操作,并在稍后使用MSI改变主意。
如果您只有一项服务,则可以排除InstallExecuteSequence
表中的服务操作。
或者,您必须在立即阶段运行CA,在延期执行期间暂时从服务表中删除条目。
我不是无缘无故分裂dll的粉丝。
正确的应用程序设计将代码分解为多个程序集中的多个类。创建一个包含服务器组件的程序集,并创建两个程序集以充当控制台主机和服务主机。您提出的建议只会导致不符合最佳做法的黑客MSI。 – 2013-02-12 17:21:59
如果ServiceInstall/@ Start属性可以设置为[Property],那将会非常好,因此您仍然可以在不启动服务的情况下安装服务。 – Ivan 2017-01-18 10:29:32