WiX:定义可能不存在的文件组件

时间:2009-11-05 17:34:03

标签: wix wix3

我需要定义一个在某些情况下可能不存在的Wix文件组件。有没有办法做到这一点? Wix中的条件元素似乎都在安装时工作,我需要在编译时检测文件是否存在并相应地构建安装程序。

2 个答案:

答案 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?>

然后将ComponentComponentGroup包含在单独的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来调用candlelight目标,为各种不同的构建和产品定义不同的变量,有效使用片段和预处理器变量为代码重新提供了很好的机会 - 在项目之间使用,或同一项目的各种版本。

在您的情况下,要检查文件是否存在...那么您只需使用内部函数来定义或重新定义稍后传递给WiX的变量。 e.g:

<if test="${not file::exists('something.dll')}">
    <property name="releasetype" value="blahblahblah" />
</if>