2013-10-21 75 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

斯蒂芬 - 許多謝謝您回答;有趣的是,我知道我已經設定了整條道路......但最終我把你的榜樣作爲底部,它是一種享受! –