2017-06-15 121 views
0

我在安裝兩種工作模式:從以前的安裝遺留 如何在WIX安裝期間有條件地覆蓋文件?

  • 刪除所有現有CONFIGS

    1. 使用的配置文件,並把默認CONFIGS代替

    模式由複選框中確定安裝程序的WPF UI。如果選擇了第二模式,則CustomAction運行,其手動地從磁盤中刪除CONFIGS文件夾:

    <InstallExecuteSequence> 
        <Custom Action="RemoveConfigsFolder" After="RemoveFolders" Overridable="yes">NOT Installed AND DELETESETTINGS=1</Custom>  
    </InstallExecuteSequence> 
    

    我使用NeverOverwrite屬性:

    <ComponentGroup Id="Configs" Directory="INSTALLDIR" > 
        <Component Id="Configs" Permanent="yes" NeverOverwrite="yes"> 
        <File Id="main.config" Name="main.config" Source=".\Configs\main.config" KeyPath="yes" /> 
        </Component> 
    </ComponentGroup> 
    

    第一模式在這種情況下工作得很好,但是當我嘗試使用第二種模式時,它會失敗,並且所有配置都將被刪除,並且在安裝過程中不會再次創建。

    在我的問題的研究,我想我已經找到了之所以出現這種情況:https://community.flexerasoftware.com/showthread.php?96157-The-truth-the-whole-truth-about-quot-Never-overwrite-quot-and-quot-Permanent-quot-files&p=156826#post156826

    其實這是一個Windows安裝程序的問題。如果您記錄卸載 ,您會注意到在安裝的早期安裝程序 決定包含此文件的組件將不會安裝 ,因爲它被標記爲「從不覆蓋」,並且此文件的副本已在目標上存在 機。卸載發生在那個 刪除現有文件之後。這是因爲安裝程序在啓動「CostFinalize」操作時決定使用此 。此操作必須在「RemoveFiles」操作之前運行 。

    但我該如何解決?

  • +0

    這是一個重大的升級情況,如果是的話,它在哪裏安排? – PhilDW

    回答

    0

    我最初的想法是刪除'Never Overwrite'屬性。然後創建一個組件條件來檢查文件是否存在。我的想法是,您的自定義操作具有正確刪除配置文件的條件。如果文件不存在,則會選擇組件進行安裝。

    3

    永遠覆蓋或永久性設置的問題是它們看起來像構建設置,但它們不是真的 - 它們堅持連接到組件ID的系統。因此,重置項目將無濟於事,因爲它與該ID相關聯。目前還不清楚爲什麼設置Never Overwrite可能是解決某些問題的解決方案,因爲根據定義,修補程序和覆蓋升級不會覆蓋它,但覆蓋它是您安裝的要求。

    即使您沒有設置永不覆蓋Windows安裝程序規則也不會覆蓋該文件,如果它在安裝後被修改。所以,如果你已經安裝了它,然後它被修改了,然後你進行了升級,那麼這個文件就不會被覆蓋(這是永不覆蓋似乎不需要的另一個原因)。

    另一個問題是您的自定義操作RemoveConfigsFolder沒有標記爲Execute枚舉值,因此它是立即的,因此它不會運行提升,因此它可能只是失敗,所以如果沒有看到代碼就不可能說如果如果無法刪除,則報告問題。也無法確定它是否明確指定了文件夾的完整路徑。所以這個問題最有可能的快速解決方案是將自定義操作標記爲執行延遲,並且需要通過CustomActionData傳遞DELETESETTINGS值。

    +0

    問題是,我並不總是*升級*。有時會在卸載和安裝之後進行。據我瞭解,在這種情況下,Windows Installer規則以另一種方式工作,即使安裝後修改了文件,它們也會覆蓋該文件。這是我需要使用永不覆蓋的情況。 – GaGar1n