我有一个WIX MSI项目,用于我们产品的不同风格,所以我根据产品的味道/类型做了各种各样的陈述,并且知道一切似乎都按预期工作。但现在已经决定其中一种口味需要安装在不同的位置(实际上是安装到另一家公司的安装文件夹 - 由于我们的应用程序不是GAC' d),但我现在有一些"乐趣"试图实现这一点。
我有一个目录结构,类似于:
<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>
虽然这些方法在我运行安装程序时编译正常(顺便说一下,Wix 3.6)但它会出现错误,例如&#34;无法访问网络位置XXXXXXXX&#34;其中XXXXXX是APPLICATIONFOLDER中的值。
我现在已达到了(并不需要太多)我的Wix技能限制,所以希望有人在这里可以解决一些问题?
干杯,
克里斯。
答案 0 :(得分:0)
使用<CustomAction>
或<SetDirectory>
将目录设置为新路径时,必须将目录设置为完整路径,而不仅仅是单个片段。< / p>
例如:
<?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)">
....