2013-10-21 30 views
0

我有一个WIX MSI项目,用于我们产品的不同口味,因此我有各种基于产品口味/类型来做事情的陈述,并且知道所有事情似乎都按预期工作。但现在已经决定,其中一种口味需要安装在不同的位置(实际上是安装到其他公司的安装文件夹 - 由于我们的应用不是GAC),但我现在有一些“有趣”的尝试执行此操作。WIX - 基于预处理器变量更改APPLICATIONFOLDER

我有一个目录结构,类似于:

<Directory Id="TARGETDIR" Name="SourceDir"> 
    <Directory Id="ProgramFilesFolder"> 
     <Directory Id="COMPANYFOLDER" Name="FirstCompany"> 
     <Directory Id="APPLICATIONFOLDER" Name="FirstProduct" > 

,并因为它的立场没有关系 - 这将安装到Program Files文件\ FirstCompany \ FirstProduct。

但是我有一个名为FLAVOR的预处理变量,可以是1或2。如果它是1,那么我想要安装到上面的结构;但如果它是2我想安装到Program Files \ SecondCompany \ SecondProduct

基本上如果它是2 - 那么我们实际上安装到另一家公司的安装位置。

我已经尝试了各种各样的事情来实现这个功能,比如:

<?if $(var.FLAVOUR)=1?> 
    <SetDirectory Id="COMPANYFOLDER" Value="FirstCompany" Sequence="execute"/> 
    <SetDirectory Id="APPLICATIONFOLDER" Value="FirstProduct" Sequence="execute"/> 
<?else?> 
    <SetDirectory Id="COMPANYFOLDER" Value="SecondCompany" Sequence="execute"/> 
    <SetDirectory Id="APPLICATIONFOLDER" Value="SecondProduct" Sequence="execute"/> 
<?endif? 

这是在同一个片段,其中的目录结构建立完成 - 但这并没有工作。

也试过:

<CustomAction Id="SetCompanyDirToFirst" 
        Directory="COMPANYFOLDER" 
        Value="FirstCompany" /> 

    <InstallExecuteSequence> 
     <Custom Action="SetCompanyDirToFirst" Before="InstallFiles">$(var.FLAVOUR)=1</Custom> 
     .... 
    </InstallExecuteSequence> 

虽然这些方法编译OK(顺便说一句维克斯3.6)当我运行安装程序,它与错误,如抱怨“无法访问网络位置XXXXXXXX”,其中XXXXXX是APPLICATIONFOLDER值。

我现在已经达到了(并不需要太多)我的威克斯技能的限制,所以希望有人在这里可以摆脱一些光线?

干杯,

克里斯。

回答

0

使用时无论是<CustomAction><SetDirectory>设置目录的新路径,您必须将目录设置为完整路径,而不仅仅是单一的片段。

例如:

<?if $(var.FLAVOUR) = 1 ?> 
    <SetDirectory Id="APPLICATIONFOLDER" Value="[ProgramFilesFolder]FirstCompany\FirstProduct" Sequence="execute" /> 
<?else?> 
    <SetDirectory Id="APPLICATIONFOLDER" Value="[ProgramFilesFolder]SecondCompany\SecondProduct" Sequence="execute" /> 
<?endif?> 

因为你设置的APPLICATIONFOLDER目录的完整路径,你并不需要更改COMPANYFOLDER目录。

但是,如果你使用的预处理这种方式,你并不需要在所有使用自定义操作,你可以在编译的时候做的一切:

<?if $(var.FLAVOUR) = 1 ?> 
    <?define CompanyFolderName = "FirstCompany" ?> 
    <?define ProductFolderName = "FirstProduct" ?> 
<?else?> 
    <?define CompanyFolderName = "SecondCompany" ?> 
    <?define ProductFolderName = "SecondProduct" ?> 
<?endif?> 

<Directory Id="TARGETDIR" Name="SourceDir"> 
    <Directory Id="ProgramFilesFolder"> 
     <Directory Id="COMPANYFOLDER" Name="$(var.CompanyFolderName)"> 
     <Directory Id="APPLICATIONFOLDER" Name="$(var.ProductFolderName)"> 
      .... 
+0

斯蒂芬 - 许多谢谢您回答;有趣的是,我知道我已经设定了整条道路......但最终我把你的榜样作为底部,它是一种享受! –