2012-08-24 20 views
12

L'impostazione della directory funziona perfettamente per me.Come si installa nella cartella LocalAppData?

<Directory Id='TARGETDIR' Name='SourceDir'> 
    <Directory Id="ProgramFilesFolder"> 
    <Directory Id='INSTALLDIR' Name='MyApp'/> 
    </Directory> 
</Directory> 

Tuttavia, quando ho provato a cambiare "ProgramFilesFolder" a "LocalAppDataFolder" un sacco, ho avuto di errore quando si utilizza light di collegare e generare il mio msi:

D:\runGroup.wxs(53) : error LGHT0204: ICE38: Component cmpA5561BE36D80EB58252E69DDA0C2FF8C installs to user profile. It must use a registry key under HKCU as its KeyPath, not a file. D:\main.wxs(38) : error LGHT0204 : ICE64: The directory INSTALLDIR is in the user profile but is not listed in the Remove File table.

Sembra " LocalAppDataFolder "non è accettabile per WiX, mentre credo che sia una delle proprietà della cartella di sistema definite in here.

Che cosa dovrei usare per la cartella LocalAppData?

+0

Il mio consiglio: non installare affatto su nessuna cartella del profilo utente. Installa su [ProgramFilesFolder] e consenti al sistema operativo di eseguire qualsiasi reindirizzamento. Ogni sistema operativo potrebbe fare questo in modo diverso e il tuo "correzioni sotto il cofano" sarà senza dubbio controproducente. Se la cartella non viene reindirizzata dal sistema operativo, il conteggio dei riferimenti MSI dovrebbe essere in grado di gestire diverse installazioni per diversi utenti nella stessa cartella. Assicurati solo di non avere alcun file di lettura/scrittura che hai modificato nella cartella. La tua cartella di installazione dovrebbe essere di sola lettura. Non combattere le idiosincrasie di Windows - si morde con una vendetta. –

+0

Il problema qui è che non so come consentire a [ProgramFilesFolder] di reindirizzare sul posto che dovrebbe essere per l'installazione per utente. Ecco perché ho dovuto trovare soluzioni alternative. – Deqing

+0

Sì, e non dovresti ridirigerlo affatto :-). Windows potrebbe reindirizzare ancora una volta, e in modi diversi su Vista, Windows 7, Windows 8, ecc ... Windows Installer è pericoloso con cui combattere - combatte contro. È comunque possibile installare su [ProgramFilesFolder] anche per un'installazione per utente, e alcune versioni di Windows potrebbero reindirizzare automaticamente la stessa, altre potrebbero installarsi su ProgramFilesFolder. Non scherzare, lascia che funzioni come dice Windows. –

risposta

1

Ok, appena scoperto che ce la possiamo fare sovrascrivendo "ProgramFilesFolder":

<SetProperty Id="ProgramFilesFolder" Value="[LocalAppDataFolder]" Before="CostFinalize"><![CDATA[NOT Privileged]]></SetProperty> 

Un'altra cosa da fare è, in <Package> abbiamo bisogno di impostare InstallPrivileges-limited.

Bene, non vedo alcun motivo per cui "ProgramFilesFolder" può essere utilizzato direttamente mentre "LocalAppDataFolder" non può.

+0

Perché non è necessario farlo. Reindirizza automaticamente su Win7. –

+0

ProgramFilesFolder non sta reindirizzando il mio Win7. Ho provato InstallPrivileges sia con 'limitato' che con valore di default, tutto impostato% ProgramFilesFolder% su 'C: \ Programmi (x86)'. Come posso attivare questo reindirizzamento? E un'altra domanda, nota che in WixUI_Advanced, imposta esplicitamente il percorso di installazione per utente a% LocalAppData% \ Apps \ ProgramName. Quindi qual è la versione ufficiale di un programma dovrebbe essere installata per utente? '% LocalAppData% \ Apps' o'% LocalAppData% \ Programs'? – Deqing

+1

Deqing, questa soluzione sembra pericolosa: sono sorpreso che Windows Installer ti consenta effettivamente di farlo. –

2

Si sta installando per utente o per macchina? Inoltre, quali versioni del sistema operativo stai prendendo in considerazione? Si potrebbe desiderare di leggere:

Authoring a single package for Per-User or Per-Machine Installation context in Windows 7

+0

Sto installando per utente, ecco perché ho bisogno di LocalAppData nella struttura delle directory. E sarà installato su Win7. Per me l'unico modo per fare è usare 'SetProperty' come ho descritto prima. – Deqing

+0

Secondo questo articolo, le installazioni per utente su Win7 utilizzando ProgramFilesFolder reindirizzeranno automaticamente a LocalAppData \ Programmi. Questo non funziona per te? –

+0

Ho appena creato un test per l'installazione utente utilizzando InstallShield e l'ho configurato utilizzando [ProgramFilesFolder] Nome azienda/Nome prodotto personale e ne sono sicuro che sia installato su C: \ Users \ chrpai \ AppData \ Local \ Programs \ My Company Name \ My Product Name –

7

ho convertito un'applicazione dall'essere un perMachine installare ad essere installa un Peruser. Per poter convertire correttamente l'installazione ho dovuto aggiungere una chiave di registro per ciascuno dei componenti che ho.

Originariamente ho avuto il seguente:

<Component Id="C.MyExe"> 
    <File Id="Fi.MyExe" Name="$(var.MyExe.TargetFileName)" Source="$(var.MyExe.TargetPath)" DiskId="1"> 
    <Shortcut Id="SC.StartMenu" 
       Directory="D.ApplicationMenuDir" 
       Name="$(var.AppName)" 
       WorkingDirectory="INSTALLDIR" 
       Icon="MY_ICON.ico" 
       IconIndex="0" 
       Advertise="yes" 
     /> 
     ... 

Quando mi sono trasferito la componente exe per l'utente di installazione che dovevo fare qualcosa di simile:

<Directory Id="LocalAppDataFolder" Name="AppData"> 
    <Directory Id="MyAppDirectory" Name="$(var.AppName)"> 
    <Component Id="C.MyExe" Guid="{MY_GUID}"> 
     <CreateFolder /> 
     <RemoveFolder Id="RemoveMyAppDirectory" On="uninstall" /> 
     <RegistryKey Root="HKCU" Key="Software\MyCompany\MyApp"> 
     <RegistryValue Name="MainExe" Value="1" KeyPath="yes" Type="integer" /> 
     </RegistryKey> 
     <File Id="Fi.MyExe" Name="$(var.MyExe.TargetFileName)" 
      Source="$(var.MyExe.TargetPath)" DiskId="1" Checksum="yes"> 
     </File> 
    </Component> 
    ... 

La parte più importante è che si aggiungere una chiave di registro che punta a HKEY_CURRENT_USER. Ho aggiunto un valore di registro per ogni componente che indica che il componente è installato.

Ho anche dovuto rimuovere quanto segue: Advertise="yes".

+0

Mi è stato detto che è possibile ignorare ICE38 poiché è valido solo per postazioni miste per utente/per macchina e non valido per un'installazione per utente pura. Vedi [qui] (http://stackoverflow.com/a/21715783/623561). – Wes

1

Ho avuto questo problema di recente. Volevo convertire il mio programma di installazione da per-macchina a un utente per utente, ma stava ricevendo ICE38. Ho chiesto agli utenti di wix e un parere era che si potesse ignorare ICE38 perché era inteso come controllo per le installazioni per macchina.

Vedere the discussion at wix-users.

Dato che questo è il caso, ICE38 è (a mio avviso) errato e vorrete ignorarlo. ICE38 implica l'installazione di risorse per utente nel contesto di un'installazione per macchina, ma non verifica mai che sia così.

In realtà, per l'installazione di un utente è necessario ignorare ICE38 perché non sarà mai preciso per quel mondo.

[Edit] Sembra che hai aiutare here.

Da Peter Shirtcliffe:

Questa è la mia, è vero inesperta, la comprensione di impianti per utente:

Installazione di sottodirectory di LocalAppDataFolder è perfettamente OK in un singolo utente MSI . A causa di determinati scenari relativi agli utenti in roaming, è necessario aggiungere componenti contenenti elementi per qualsiasi directory creata in LocalAppDataFolder. . Ecco perché ICE64 è che appare.

L'errore ICE38 è leggermente fuorviante: dal momento che si dispone di un installazione per utente, è sicuro di ignorare fino a quando l'utente non può scegliere un percorso di installazione alternativo che è comune a tutti gli utenti. ICE38 è che verifica la situazione in cui più utenti installano lo stesso componente nello stesso percorso.

Pubblicare solo per aiutare altre persone (come me).

Problemi correlati