代码之家  ›  专栏  ›  技术社区  ›  nagul

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

  •  1
  • nagul  · 技术社区  · 16 年前

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

    2 回复  |  直到 16 年前
        1
  •  1
  •   saschabeaumont    16 年前

    正如我所说, 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的变量。例如。:

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

    似乎您需要检查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>
    

    还有更多!变量,定义,条件。查看那个文档页面。

    推荐文章