我需要定义一个在某些情况下可能不存在的Wix文件组件。有没有办法做到这一点? Wix中的条件元素似乎都在安装时工作,我需要在编译时检测文件是否存在并相应地构建安装程序。
答案 0 :(得分:2)
看来你需要查看wix预处理器。查看有关该主题的wix文档: wix preprocessor
例如,假设您有一个名为APPTYPE的环境变量。如果其值设置为“Full”,则wix编译器(蜡烛)将包含并处理MyApp_Full.exe。<Component Id='MyComponent1' Guid='fff60f72-5553-4e6b-9bf0-ad62ab9a90b1'>
<?if $(env.APPTYPE) = Full?>
<File Name='MyApp_Full.exe' DiskId='1' Source='..\MyApp_Full.exe' Vital='yes' />
<?endif?>
...
</Component>
还有更多!变量,定义,条件。查看该doc页面。
答案 1 :(得分:1)
正如iwo所说,preprocessor variables是你的朋友!然而,iwo的例子可以(并且将会)违反组件规则,因为组件不是“稳定的”。最好调整整个组件(或组件组)......
<?if $(var.releasetype)=full ?>
<ComponentRef Id="Somefile.dll" />
<?elseif $(var.releasetype)=enterprise ?>
<ComponentGroupRef Id="SomethingElse" />
<?endif?>
然后将Component
和ComponentGroup
包含在单独的Fragment
标记中,以便它们仅在引用时进行编译:)
<Fragment>
<Component Id="Somefile.dll" Guid="*">
<File Id="Somefile.dll" KeyPath="yes" Source="SourceDir\Somefile.dll" />
</Component>
</Fragment>
<Fragment>
<ComponentGroup Id="SomethingElse">
<ComponentRef Id="Somefile.dll" />
<Component Id="AnotherFile.dll>
<File Id="AnotherFile.dll" KeyPath="yes" Source="SourceDir\AnotherFile.dll" />
</Component>
</ComponentGroup>
</Fragment>
我个人使用nant来调用candle
和light
目标,为各种不同的构建和产品定义不同的变量,有效使用片段和预处理器变量为代码重新提供了很好的机会 - 在项目之间使用,或同一项目的各种版本。
在您的情况下,要检查文件是否存在...那么您只需使用内部函数来定义或重新定义稍后传递给WiX的变量。 e.g:
<if test="${not file::exists('something.dll')}">
<property name="releasetype" value="blahblahblah" />
</if>