2014-10-24 18 views
11

Ho una cartella Bin con molti file nel mio progetto. Per ora, so solo come aggiungere file specifici per installare la cartella con il codice qui sotto.Wix- Come copiare una directory per installare la cartella

<File Source='$(var.Debug)Myapplication.exe' Id='file4028276A0CAD84E3BDE449237AE31A5F' /> 

Tuttavia, voglio spostare un'intera directory sul percorso di installazione. Ad esempio, sposta l'intera cartella "Bin" nel percorso di installazione "C: \ Myapplication".

Cosa devo fare allora?

Grazie in anticipo!

+0

http://stackoverflow.com/a/16061215/815938 – kennyzx

+0

possibile duplicato di [Come fare copiare una cartella in Wix] (http://stackoverflow.com/questions/16061092/how-do-copy-a-folder-in-wix) –

+0

@ La risposta di RyanJ (http://stackoverflow.com/a/26558025/5229157) deve essere contrassegnata come la risposta corretta. Molto utile. –

risposta

2

how to include a large directory tree in a wix installer

questo sembra buono. Ma troppo lavoro da fare.

How do copy a folder in wix

Il link qui sopra ha funzionato bene. Ma non è possibile copiare sottocartelle.

Quindi quello che ho fatto è stato, ho creato un app che legge l'intera cartella e ottenere le sue sottodirectory e dei file e genera i blocchi di codice necessarie come

<Component Id="myfile" Guid="GUID"> 
    <File Id="myfile.txt" Source="MySourceFiles\myfile.txt" KeyPath="yes" Checksum="yes"/> 
</Component> 

poi ho aggiunto il blocco di codice generato al. file wxs.

Il tempo iniziale che si spende per creare questa app non è uno spreco. Perché puoi continuare a usarlo per sempre. Ti consiglio di copiare file per file, perché è utile durante un aggiornamento o una riparazione. MSI conserva un record per ogni file che deve essere copiato. Quindi è mantenibile e utile su aggiornamenti e riparazioni.

+0

Quindi il suggerimento è di continuare a utilizzare il blocco di file e sviluppare uno strumento indipendente? –

+0

Sì. Piuttosto che lottare per fare cose complesse è facile usare lo strumento. Al momento lo sto facendo nel mio lavoro. Entro un secondo vengono generati i blocchi di codice. – LeoN

+0

Cura di condividere quell'app? ^^ – Kazoooka

42

Suona come quello che si desidera utilizzare è lo strumento WiX heat, che viene utilizzato per "raccogliere" una directory (o singoli file) e creare un file frammento WiX che è possibile utilizzare nel progetto.

Ad esempio, si dispone di una directory che si desidera raccogliere e può includere sottodirectory, ma ci sono molti file e si desidera tutto ... il calore lo farà per voi.

considerare questo struttura banale:

Somedir 
    | 
    |---A file.txt 
    |---An init file.ini 
    |---another file.txt 
    |---subfolder 
      | 
      |---a subfolder file.txt 

Se si utilizza il calore per raccogliere questa directory, lo strumento genererà il file frammento per voi che è possibile utilizzare come riferimento componente del progetto senza dover specificare il file uno alla volta o utilizzare una soluzione alternativa.

Ad esempio, il seguente comando di calore elaborerà questa directory (da un livello in questo esempio)

heat dir somedir -o MyHarvestedStuff.wxs -scom -frag -srd -sreg -gg -cg MyComponentGroupId -dr BIN_DIR_REF 

Dove:

dir = harvest a directory 
somedir = directory you want to harvest 
-o MyHarvestedStuff.wxs = the output fragment file 
-scom -sfrag -srd -sreg = Suppress COM elements, fragments, root directory as element, registry harvesting (these options will create a grouping that most applications can use) 
-gg = generate GUID's now (this will put the GUID's into your output file, rather than using a wildcard "*". The advantage here is you can use non-standard TARGETDIR, which would not qualify for autogenerated GUID's) 
-cg MyComponentGroupId = component group. this is what you will use in your feature set to include these files 
-dr BIN_DIR_REF = this is the directory reference for which to place the files in your final package. 

L'XML risultante assomiglia a questo (questo è stato eseguito senza -Gg per evitare la pubblicazione vera e propria del GUID)

<?xml version="1.0" encoding="utf-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Fragment> 
     <DirectoryRef Id="BIN_DIR_REF"> 
      <Directory Id="dirF065D7446868E03DB0B296EBADA4E4A1" Name="subfolder" /> 
     </DirectoryRef> 
    </Fragment> 
    <Fragment> 
     <ComponentGroup Id="MyComponentGroupId"> 
      <Component Id="cmp739547000B47E975B0452D876AF7810B" Directory="BIN_DIR_REF" Guid="PUT-GUID-HERE"> 
       <File Id="fil09B311A6D1EABD9E94DFA5C83F59C548" KeyPath="yes" Source="SourceDir\A file.txt" /> 
      </Component> 
      <Component Id="cmp84C8400F892D39B05EE3021CCEEAA14F" Directory="BIN_DIR_REF" Guid="PUT-GUID-HERE"> 
       <File Id="fil11A22646343997D26AC54171A62DFF4C" KeyPath="yes" Source="SourceDir\an init file.ini" /> 
      </Component> 
      <Component Id="cmpFA266FC6F3269CB5D9E42C38FC995117" Directory="BIN_DIR_REF" Guid="PUT-GUID-HERE"> 
       <File Id="filA545B6E4B63B8211E982917FC78F6EB4" KeyPath="yes" Source="SourceDir\another file.txt" /> 
      </Component> 
      <Component Id="cmp2EC5C1618A59F47B7BDE800EB9AA8688" Directory="dirF065D7446868E03DB0B296EBADA4E4A1" Guid="PUT-GUID-HERE"> 
       <File Id="filB0CD0B02385137DC806112E293083459" KeyPath="yes" Source="SourceDir\subfolder\a subfolder file.txt" /> 
      </Component> 
     </ComponentGroup> 
    </Fragment> 
</Wix> 

nel file di progetto, si sarebbe avere qualcosa di simile sotto la radice <Directory> elemento:

<Directory Id="BIN_DIR_REF" Name="bin"> 
    <!-- anything else you might put here...--> 
</Directory> 

E nel tuo gruppo funzione:

<Feature Id="Complete" Level="1"> 
    ... 
    <ComponentGroupRef Id="MyComponentGroupId" />   
    ... 
</Feature> 

Legare tutto insieme ...

  1. rifornimento il nuovo file frammento candle insieme agli altri file
  2. Fornire il file .wixobj che candle produce a light
  3. risolvere il riferimento SourceDir nel nuovo file frammento con una variabile preprocessore WiX o con l'opzione di -blight

    Es: light ... -b "path to my directory that I harvested" ...

Non lasciate che la lunghezza della risposta scoraggiare dall'esplorazione di questa soluzione, funziona abbastanza bene ed è piuttosto semplice. Ora, se si desidera escludere qualsiasi cosa, da quella directory, che è un intera altra storia ...

+1

Grazie per la risposta, è davvero d'aiuto. Credo che intendevi aggiungere ComponentGroupRef e non ComponentRef in Feature Serction. – petric

+0

@petric oh mio, sì! Grazie –

+2

Questo va oltre le grandi informazioni e IMO dovrebbe essere contrassegnato come la risposta corretta. – Dave

Problemi correlati