在MSI中使用[SourceDir]进行WiX自定义操作和刻录

时间:2014-07-08 11:46:28

标签: wix burn

我们的安装程序使用CustomAction(在InstallExecuteSequence中调用)可选地从安装程序旁边的目录中复制用户配置文件。这使用[SourceDir]来定位源目录。

我们目前有32位和64位版本,它们作为单独的.MSI文件分发。我尝试使用Burn构建包含这些.MSI文件的单个.EXE。显然,当Burn安装MSI时,其[SourceDir]位于其他地方(我看到C:\ProgramData\Package Cache\...路径),因此这个自定义操作无法正常工作。

我找到了WixBundleOriginalSource变量,但我的问题是我希望MSI文件能够独立工作并与Burn一起打包。我认为我需要有条件地将一个变量设置为WixBundleOriginalSource(如果它已定义(用户使用Burn .exe))或者如果WixBundleOriginalSource未定义(用户直接安装.MSI)则将SourceDir设置为SourceDir然后将此变量传递给我的自定义操作。 (我知道WixOriginalSource是安装程序的完整路径,而不是它所在的目录 - 我可以在我的自定义操作中处理它。)

这可能吗?如果是这样,请帮我解释一下语法。

更新

我可能会在我的自定义操作中处理条件部分,并调用它两次:一次使用[SourceDir](当直接使用MSI时有效),正如我现在所做的那样:

在我的产品中

    <CustomAction Id='CopyConfigFiles'
                  FileKey="MyInstallationUtility"
                  ExeCommand="COPYFILES [SourceDir]"
                  Execute="deferred"
                  Impersonate="no"
                  Return="ignore" />

...和WixBundleOriginalSource一次。但是,我找不到让WixBundleOriginalSource给我自定义操作的方法。使用:

                  ExeCommand="COPYFILES [WixBundleOriginalSource]"

......不起作用。使用:

在我的Burn Bundle中

    <WixVariable Id="ConfigFileLocation" Value="[WixBundleOriginalSource]" />

和我的产品

                  ExeCommand="COPYFILES [ConfigFileLocation]"

...也不起作用。两者都给我一个空字符串作为参数。

1 个答案:

答案 0 :(得分:6)

解决方案是在MSI脚本中定义一个可以通过刻录覆盖的属性,如果刻录没有设置,则让MSI脚本将其设置为[SourceDir]。

在MSI脚本中,我们定义属性(将其初始化为未设置的&#39;我们稍后测试)以及将其设置为[SourceDir]的自定义操作:

    <Property Id='CONFIGFILELOCATION' Value='unset' />
    <CustomAction Id='MsiConfigLoc' Property='CONFIGFILELOCATION' Value='[SourceDir]' Execute='immediate' />

需要安装程序位置的自定义操作已更新为使用此新属性:

<CustomAction Id='CopyConfigFiles'
              FileKey="MyInstallationUtility"
              ExeCommand="COPYFILES [CONFIGFILELOCATION]"
              Execute="deferred"
              Impersonate="no"
              Return="ignore" />

然后,InstallExecuteSequence被扩展为有条件地调用新的自定义操作(在CopyConfigFiles之前) - 仅当刻录EXE没有设置CONFIGFILELOCATION时:

        <Custom Action='MsiConfigLoc' Before='CopyConfigFiles'>CONFIGFILELOCATION="unset"</Custom>
        <Custom Action='CopyConfigFiles' Before='InstallFinalize'/>

最后,在Burn Bundle中我们将CONFIGFILELOCATION属性设置为[WixBundleOriginalSource]:

        <MsiPackage SourceFile='ProductSetup.msi' DisplayInternalUI='yes'>
            <MsiProperty Name='CONFIGFILELOCATION' Value='[WixBundleOriginalSource]' />
        </MsiPackage>

从WiX 3.9开始,最好使用[WixBundleOriginalSourceFolder],因为这会给出安装程序可执行文件所在的目录。我在这里使用[WixBundleOriginalSource](安装程序可执行文件的完整路径)处理我的自定义安装代码中的文件名。