2012-07-08 101 views
3

我正在維護一箇舊應用程序,其中用戶配置存儲在註冊表中。卸載時,它是留下的。我現在正在使用WiX重新編寫安裝程序。在註冊表中設置默認值(如果沒有)

安裝程序應該在註冊表中添加一個默認值(如果沒有),否則 現有值應單獨保留。

我在想如何在WiX中做到這一點。而我提出的解決方案有點麻煩:

<Property Id="MY_PROPERTY"> 
     <RegistrySearch Root="HKLM" Key="SOFTWARE\MyProduct" Name="MyProperty" Type="raw" /> 
    </Property> 

    <CustomAction Id="ca.SetDefaultValue" Property="MY_PROPERTY" Value="DefaultValue" /> 

    <InstallExecuteSequence> 
     <Custom After="RegistrySearch" Action="ca.SetDefaultValue">Not MY_PROPERTY</Custom> 
    </InstallExecuteSequence> 

    <Component Id="c.Registry"> 
     <RegistryValue Root="HKLM" Key="SOFTWARE\MyProduct" Name="MyProperty" Type="string" Value="[MY_PROPERTY]" /> 
    </Component> 

所以做一個註冊表搜索找到舊的價值。如果未設置,則使用計劃的自定義操作將其設置爲默認值。然後創建值「照常」。

任何人都可以想出一個更流暢的方式來做到這一點?

請注意,我不能使用像Installed這樣的方便變量,因爲值可能在那裏,被先前的,現在卸載的版本留下。

回答

8

Wix Remember Property pattern開始,但要更進一步。在運行AppSearch並且REMEMBERME屬性確實或沒有獲得值之後,如果REMEMBERME=""使用SetProperty自定義操作來分配默認值。

儘管我還是採取了一步。我有一個我稱之爲「屬性優先」的概念。基本上它是一個屬性如何獲得它的價值的優先級清單。

最高到最低:在在命令行傳遞的UI

  • 公共屬性輸入

    1. 屬性過程中Property表中定義AppSearch
    2. 默認值發現
    3. 屬性

    換句話說,在第一次沉默insta期間如果沒有在命令行傳遞的屬性,應該使用屬性表中的默認值。

    在沒有在命令行傳遞屬性的情況下進行第二次靜默安裝時,記住的值應優先於默認值。 (如果不同)

    在第一次第二次無提示安裝期間,通過命令行傳遞的屬性應視爲覆蓋值,並優先於默認值和記憶值。

    在交互式安裝過程中,發生上述規則,UI應顯示該值。如果用戶更改該值,那麼這是最終值。

    我會讓你知道如何實現各種自定義操作來做到這一點。它通常涉及一個臨時道具和一個真正的道具以及一系列設置屬性CA,它們具有正確的執行時間表和條件來執行您想要的操作。

  • +0

    謝謝恩,我欣賞它! – 2012-07-10 23:41:17

    +2

    你有一個地方的「屬性優先」的示例實現嗎?我現在正在與OP一樣苦苦掙扎,並且希望能夠完全實現您的建議。 – 2014-09-10 06:41:49

    1

    您尚未明確設置組件中的註冊表值keypath=yes。但是,在這種情況下,wix將選擇可用作關鍵路徑的第一個子項目。從wix component element documentation

    如果的keyPath未設置爲「是」的組件或子註冊表值或文件,維克斯將着眼於按順序組件下的子元素,並嘗試自動選擇一個作爲關鍵路徑。

    因此,您的註冊表值是安裝它的組件的keypath。這意味着如果註冊表值已經存在,組件將不會被安裝。據我所知,這就是你想要的行爲。

    相關問題