WiX - 如何在安装过程中使用不同的复制策略

时间:2012-08-15 09:56:54

标签: wix

在安装过程中,我的应用程序将:

步骤A,查找C:\WebService目录。如果找到,请执行以下操作:

copy *.bat      --> C:\WebService\
copy boost*.dll --> C:\WebService\libs\
copy myApp.dll  --> C:\WebService\plugins\

步骤B,如果未找到,请执行以下操作:

copy *.bat --> [LocalAppData]\myApp\bin\
copy *.dll --> [LocalAppData]\myApp\libs\

我该怎么做?

修改

我完成了第2步:

  1. 创建源目录:

    src\bin
    src\libs

  2. 将文件复制到这些子目录

  3. 使用heat扫描src目录并将组生成为wxs文件。

  4. 这里的问题是,对于步骤A,我必须再次做同样的事情。但是有大量的* .dll,将它们再次复制到另一个目录看起来并不是一个好主意。

2 个答案:

答案 0 :(得分:3)

您表达问题的方式表明您对Windows Installer的理解存在巨大差距。 MSI / WiX不是脚本语言。您需要了解AppSearch,功能,Directorties,组件和条件的工作原理。基本上,您需要将文件分组为组件,并使用AppSearch检测目录是否存在。然后在条件中使用该搜索的结果来决定安装哪些文件。

答案 1 :(得分:0)

好的,终于解决了。

简而言之,我是通过编写C ++程序来帮助的。

详细信息如下..

我的wxs就像:

<Directory Id='TARGETDIR' Name='SourceDir'>
  <Directory Id='WebDir'>
      <Directory Id='INSTALLDIR' Name='$(var.ProductName)'/>
  </Directory>
  <Directory Id='DefaultDir'/>
</Directory>

现在使用heat收集我的源目录,为candle生成另一个wxs文件,并light链接

然后是我的C ++程序,它被设计为

  1. 扫描整个生成的wxs文件以创建另一个目录结构。
  2. 替换目录,组件和文件的所有ID以使其唯一。
  3. 为所有新组件生成新的GUID。
  4. 收集所有新组件ID以创建新组件组。
  5. 可以引用这个新组件组有条件地安装,取决于是否有注册表项,或者是否找到该目录,在我的情况下它是:

      <Feature Id='RuntimeChrome' Level='1'>
        <Condition Level='0'>NOT INSTALLDIR_REGCU AND NOT INSTALLDIR_REGLM</Condition>
        <ComponentGroupRef Id='WebGroup' />
      </Feature>
      <Feature Id='RuntimeDefault' Level='1'>
        <ComponentGroupRef Id='DefaultGroup' />
      </Feature>
    

    使用这些wxs文件,可以在不同的场景下将软件包安装到不同的位置。