[wix-users] Preserving recursive directory structure during component copy

Rob Mensching rob at firegiant.com
Tue Dec 31 08:17:35 PST 2019


Need to give them different File/@Ids. In WiX v3, File/@Id defaults to File/@Name. In WiX v4, it's smarter.

Short replies here. Complete answers here: https://www.firegiant.com/services/

-----Original Message-----
From: wix-users <wix-users-bounces at lists.wixtoolset.org> On Behalf Of Zac Harvey via wix-users
Sent: Tuesday, December 31, 2019 5:19 AM
To: Edwin Castro <egcastr at gmail.com>; Zac Harvey via wix-users <wix-users at lists.wixtoolset.org>
Cc: Zac Harvey <zharvey at pobox.com>
Subject: Re: [wix-users] Preserving recursive directory structure during component copy

Thanks so much Edwin, I think I'm close now, however this method does not seem to like it if there are multiple files with the same name, even if they live in two different subdirectories:

<Directory Id="Jre8Folder" Name="jre8">
 <Directory Id="Jre8LibFolder" Name="lib">  <Directory Id="Jre8LibSecurityFolder" Name="security">  <Directory Id="Jre8LibSecurityPolicyFolder" Name="policy">  <Directory Id="Jre8LibSecurityPolicyLimitedFolder" Name="limited" />  <Directory Id="Jre8LibSecurityPolicyUnlimitedFolder" Name="unlimited" />  </Directory>  </Directory>  </Directory> </Directory>

<Component Id="Jre8LibSecurityPolicyUnlimitedLocal_policyJarComponent" Directory="Jre8LibSecurityPolicyUnlimitedFolder">
 <File Source="jre8/lib/security/policy/unlimited/local_policy.jar" /> </Component> <Component Id="Jre8LibSecurityPolicyUnlimitedUs_export_policyJarComponent" Directory="Jre8LibSecurityPolicyUnlimitedFolder">
 <File Source="jre8/lib/security/policy/unlimited/US_export_policy.jar" /> </Component> <Component Id="Jre8LibSecurityPolicyLimitedLocal_policyJarComponent" Directory="Jre8LibSecurityPolicyLimitedFolder">
 <File Source="jre8/lib/security/policy/limited/local_policy.jar" /> </Component> <Component Id="Jre8LibSecurityPolicyLimitedUs_export_policyJarComponent" Directory="Jre8LibSecurityPolicyLimitedFolder">
 <File Source="jre8/lib/security/policy/limited/US_export_policy.jar" /> </Component>

In the above WiX XML, when I build the solution in VS Community 2019, I get the following error:

Severity Code Description Project File Line Suppression State Suppression State Error Duplicate symbol 'File:local_policy.jar' found. This typically means that an Id is duplicated. Check to make sure all your identifiers of a given type (File, Component, Feature) are unique. my-app-setup C:\Users\MyUser\Source\Repos\my-app-setup\my-app-setup\my-app-setup.wxs 313 

So it doesn't like the fact that a file named *local_policy.jar* lives inside two different subdirs (*limited* and *unlimited*)...any idea what the fix is here? (The build *also* complains about the other "duplicate" files such as *US_export_policy.jar* living in multiple subdirs as well; I'm just focusing on *local_policy.jar* as an example here.)

Thanks again so much!

Best,
Zac

On Mon, Dec 30, 2019, at 4:03 PM, Edwin Castro wrote:
> You need to author the entire directory structure and place the files in the desired directory:
> 
> <Directory Id="TARGETDIR" Name="SourceDir">  <Directory 
> Id="ProgramFilesFolder">  <Directory Id="INSTALLFOLDER" Name="MyApp">  
> <Directory Id="TestoFolder" Name="testo">  <Directory Id="FizzFolder" 
> Name="fizz">  <Directory Id="AbcFolder" Name="abc">  <Directory 
> Id="DefFolder" Name="def">  <Directory Id="GhiFolder" Name="ghi" />  
> </Directory>  </Directory>  </Directory>  </Directory>  </Directory>  
> </Directory> </Directory>
> 
> <Component Id="FooTxtComponent" Directory="TestoFolder">  <File 
> Source="testo/foo.txt" /> </Component>
> 
> <Component Id="AbbaComponent" Directory="GhiFolder">  <File 
> Source="testo/fizz/abc/def/ghi/abba.txt" /> </Component>
> 
> <Component Id="ExecutableComponent" Directory="INSTALLFOLDER">  <File 
> Source="my-app.exe" /> </Component>
> 
> --
> Edwin G. Castro
> 
> 
> On Mon, Dec 30, 2019 at 12:28 PM Zac Harvey via wix-users <wix-users at lists.wixtoolset.org> wrote:
>> Wix 3.11.2 and Visual Studio Community 2019 here. My project has the following directory structure:
>> 
>>  ...\Source\Repos\my-app-setup\
>>  my-app-setup\
>>  bin\
>>  obj\
>>  testo\
>>  fizz\
>>  abc\
>>  def\
>>  ghi\
>>  abba.txt
>>  buzz\
>>  bar.txt
>>  foo.txt
>>  my-app.exe
>>  my-app-setup.wixproj
>>  my-app-setup.wxs
>>  my-app-setup.sln
>> 
>> 
>>  Where the *my-app-setup.wxs* file is as follows:
>> 
>>  <?xml version="1.0" encoding="UTF-8"?>  <Wix 
>> xmlns="http://schemas.microsoft.com/wix/2006/wi">
>>  <Product Id="*" Name="MyApp" Language="1033" Version="1.0.0.0" 
>> Manufacturer="MyCompany" 
>> UpgradeCode="1e540666-dda2-4cbe-91b7-ac9525d96c86">
>>  <Package Description="MyApp tool" Compressed="yes" />
>> 
>>  <MediaTemplate EmbedCab="yes"/>
>> 
>>  <Directory Id="TARGETDIR" Name="SourceDir">  <Directory 
>> Id="ProgramFilesFolder">  <Directory Id="INSTALLFOLDER" Name="MyApp" 
>> />  </Directory>
>> 
>>  <Directory Id="DesktopFolder" Name="Desktop">  <Component 
>> Id="ApplicationShortcutDesktop" Guid="*">  <Shortcut 
>> Id="ApplicationDesktopShortcut"
>>  Name="MyApp"
>>  Description="Shortcut for MyApp"
>>  Target="[INSTALLFOLDER]my-app.exe"
>>  WorkingDirectory="INSTALLFOLDER"/>
>>  <RemoveFolder Id="DesktopFolder" On="uninstall"/>  <RegistryValue  
>> Root="HKCU"
>>  Key="Software/MyApp"
>>  Name="installed"
>>  Type="integer"
>>  Value="1"
>>  KeyPath="yes"/>
>>  </Component>
>>  </Directory>
>>  </Directory>
>> 
>>  <Component Id="FooTxtComponent" Directory="INSTALLFOLDER">  <File 
>> Source="testo/foo.txt" />  </Component>
>> 
>>  <Component Id="AbbaComponent" Directory="INSTALLFOLDER">  <File 
>> Source="testo/fizz/abc/def/ghi/abba.txt" />  </Component>
>> 
>>  <Component Id="ExecutableComponent" Directory="INSTALLFOLDER">  
>> <File Source="my-app.exe" />  </Component>
>> 
>>  <Feature Id="MainFeature" Title="MyApp" Level="1">  <ComponentRef 
>> Id="FooTxtComponent" />  <ComponentRef Id="AbbaComponent" />  
>> <ComponentRef Id="ExecutableComponent" />
>> 
>>  <ComponentRef Id="ApplicationShortcutDesktop" />  </Feature>  
>> </Product>  </Wix>
>> 
>>  So it basically just copies a bunch of files from the project into the *C:\Program Files (x86)\MyApp* directory and then creates a shortcut (to the EXE) on the desktop. Simple stuff.
>> 
>>  When I build this and run the MSI the resulting *C:\Program Files (x86)\MyApp* directory looks like this:
>> 
>>  C:\Program Files (x86)\
>>  MyApp\
>>  foo.txt
>>  abba.txt
>>  my-app.exe
>> 
>>  So WiX is just plucking the files I specified and dropping them into the *MyApp* directory, at the same level as the EXE file. I *don't* want this; I want to preserve the same recursive directory structure as what exists in my VS project. So instead of the above I would like the WiX MSI to generate:
>> 
>>  C:\Program Files (x86)\
>>  MyApp\
>>  testo\
>>  fizz\
>>  abc\
>>  def\
>>  ghi\
>>  abba.txt
>>  foo.txt
>>  my-app.exe
>> 
>>  *What is the simplest way to accomplish this?*
>> 
>>  Thanks!
>> 
>>  ____________________________________________________________________
>>  WiX Toolset Users Mailing List provided by FireGiant 
>> http://www.firegiant.com/

____________________________________________________________________
WiX Toolset Users Mailing List provided by FireGiant http://www.firegiant.com/



More information about the wix-users mailing list