That sounds like a great idea.  I've been through a few variations of how to 
work round this 
problem, all of which were/are pretty nasty.  Would this be v3 only or v2 as 
well?

Rob

Derek Cicerone wrote:
> There has been a lot of demand for a way to easily author simple 
> variations on a single component template very quickly.  The need for 
> such a solution is evident if you’ve ever wanted to create a single 
> component in multiple language versions or for multiple platforms and 
> found yourself try to get it working in the preprocessor or manually 
> authoring all the variations.  Here is a proposal for how I believe this 
> could be done with a preprocessor extension which I’m currently calling 
> WixPivotsExtension™ J
> 
>  
> 
> Desired result:
> 
>     <Fragment>
> 
>         <DirectoryRef Id="TARGETDIR">
> 
>                 <Component Id="MyComponent.*x86.en_us*" 
> Guid="*{22B5A745-4784-407c-9D76-DAA07495993C}*" Win64=”*no*”>
> 
>                     <File Id="File1.*x86.en_us*" Name="test.txt" 
> Source="SourceDir\*x86\en_us*\test.txt" KeyPath="yes" />
> 
>                     <File Id="File2.*x86.en_us*" Name="test2.txt" 
> Source="SourceDir\*x86\en_us*\test2.txt" />
> 
>                     <RegistryValue Root="HKLM" Key="Software\MyProduct" 
> Name="*en_us*" Value="1" Type="integer" />
> 
>                 </Component>
> 
>             </Directory>
> 
>     </Fragment>
> 
>  
> 
>     <Fragment>
> 
>         <DirectoryRef Id="TARGETDIR">
> 
>                 <Component Id="MyComponent.*x86.he_il*" 
> Guid="*{6ABEA558-276D-4aa1-AADC-D6D415431154}*" Win64=”*no*”>
> 
>                     <File Id="File1.*x86.he_il*" Name="test.txt" 
> Source="SourceDir\*x86\he_il*\test.txt" KeyPath="yes" />
> 
>                     <File Id="File2.*x86.he_il*" Name="test2.txt" 
> Source="SourceDir\*x86\he_il*\test2.txt" />
> 
>                     <RegistryValue Root="HKLM" Key="Software\MyProduct" 
> Name="*he_il*" Value="1" Type="integer" />
> 
>                 </Component>
> 
>             </Directory>
> 
>     </Fragment>
> 
>  
> 
>     <Fragment>
> 
>         <DirectoryRef Id="TARGETDIR">
> 
>                 <Component Id="MyComponent.*x64.en_us*" 
> Guid="*{4BBD4239-19CC-4792-8738-D196929367D3}*" Win64=”*yes*”>
> 
>                     <File Id="File1.*x64.en_us*" Name="test.txt" 
> Source="SourceDir\*x64\en_us*\test.txt" KeyPath="yes" />
> 
>                     <File Id="File2.*x64.en_us*" Name="test2.txt" 
> Source="SourceDir\*x64\en_us*\test2.txt" />
> 
>                     <RegistryValue Root="HKLM" Key="Software\MyProduct" 
> Name="*en_us*" Value="1" Type="integer" />
> 
>                 </Component>
> 
>             </Directory>
> 
>     </Fragment>
> 
>  
> 
>     <Fragment>
> 
>         <DirectoryRef Id="TARGETDIR">
> 
>                 <Component Id="MyComponent.*x64.he_il*" 
> Guid="*{CE2D5AAC-CD05-4fee-B310-9522E6F6615F}*" Win64=”*yes*”>
> 
>                     <File Id="File1.*x64.he_il*" Name="test.txt" 
> Source="SourceDir\*x64\he_il*\test.txt" KeyPath="yes" />
> 
>                     <File Id="File2.*x64.he_il*" Name="test2.txt" 
> Source="SourceDir\*x64\he_il*\test2.txt" />
> 
>                     <RegistryValue Root="HKLM" Key="Software\MyProduct" 
> Name="*he_il*" Value="1" Type="integer" />
> 
>                 </Component>
> 
>             </Directory>
> 
>     </Fragment>
> 
>  
> 
>  
> 
> Here’s what the template might look like (MyComponent.wxs):
> 
> <?xml version="1.0" encoding="UTF-8"?>
> 
> <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi";>
> 
>  
> 
> *    <?foreach pivot in MyComponentPivots.xml?>*
> 
>     <Fragment>
> 
>         <DirectoryRef Id="TARGETDIR">
> 
>                 <Component Id="MyComponent.*$(var.Pivot.Suffix)*" 
> Guid="*$(var.Pivot.Guid)*" Win64="*$(var.Pivot.Win64)*">
> 
>                     <File Id="File1.*$(var.Pivot.Suffix)*" 
> Name="test.txt" Source="*$(var.Pivot.FilePrefix)*\test.txt" KeyPath="yes" />
> 
>                     <File Id="File2.*$(var.Pivot.Suffix)*" 
> Name="test2.txt" Source="*$(var.Pivot.FilePrefix)*\test2.txt" />
> 
>                     <RegistryValue Root="HKLM" Key="Software\MyProduct" 
> Name="*$(var.Pivot.Culture)*" Value="1" Type="integer" />
> 
>                 </Component>
> 
>             </Directory>
> 
>     </Fragment>
> 
> *    <?endforeach?>*
> 
>  
> 
> </Wix>
> 
>  
> 
> And here’s how the values are specified (MyComponentPivots.xml):
> 
> <?xml version="1.0" encoding="UTF-8"?>
> 
> <Pivots Suffix=".$(var.Pivot.Platform).$(var.Pivot.Culture)" 
> FilePrefix="SourceDir\$(var.Pivot.Platform)\$(var.Pivot.Culture)">
> 
>     <Pivot Platform="x86" Win64="no">
> 
>         <Pivot Culture="en_us" 
> Guid="{22B5A745-4784-407c-9D76-DAA07495993C}" />
> 
>         <Pivot Culture="he_il" 
> Guid="{6ABEA558-276D-4aa1-AADC-D6D415431154}" />
> 
>     <Pivot>
> 
>     <Pivot Platform="x64" Win64="yes">
> 
>         <Pivot Culture="en_us" 
> Guid="{4BBD4239-19CC-4792-8738-D196929367D3}" />
> 
>         <Pivot Culture="he_il" 
> Guid="{CE2D5AAC-CD05-4fee-B310-9522E6F6615F}" />
> 
>     <Pivot>
> 
> </Pivots>
> 
>  
> 
>  
> 
> So basically, there would be a preprocessor extension that runs before 
> the normal WiX preprocessor and expands out the foreach statement into 
> different views on the component using the various pivots from the xml file.
> 
>  
> 
> Here’s the details of how it would work:
> 
>    1. Find <?foreach?> statements and their corresponding pivots.xml files.
>    2. For each leaf node in the pivots.xml file, create a view of the
>       Fragment inside the <?foreach?>.  (In the example above, there are
>       4 leaf nodes and thus 4 views on the component).
>    3. Traverse the xml from the document element down to the leaf node
>       turning all the attributes encountered along the way into
>       preprocessor variables (those which are set multiple times will be
>       overridden by the children – so inheritance is possible).
>    4. All variables are set with “Pivot.” In front of them to avoid
>       collisions with variables that may be specified on the candle
>       command line and via <?define?> statements.  (I’m flexible on
>       whether this is important or not – we could also just set the
>       variables directly which would mean less typing in the WiX source
>       file to use the variables).
>    5. Run the normal WiX preprocessor over the now expanded authoring,
>       thus resulting in the desired authoring above.
> 
>  
> 
> Note that this system is completely flexible in terms of the naming 
> conventions for the variables which are set – you can use whatever names 
> you like.  I’ve used “Platform” and “Culture” but you could use 
> “Processor” and “Language” or whatever else is appropriate for your 
> organization.  You could just have one pivot if language is all that 
> matters of add as many more as you want as necessary.  You can even 
> define meta-variables for suffixes of identifiers and prefixes of file 
> paths.
> 
>  
> 
> I look forward to hearing your feedback.
> 
>  
> 
> Thanks,
> 
> Derek
> 
> 
> ------------------------------------------------------------------------
> 
> -------------------------------------------------------------------------
> Take Surveys. Earn Cash. Influence the Future of IT
> Join SourceForge.net's Techsay panel and you'll get the chance to share your
> opinions on IT & business topics through brief surveys -- and earn cash
> http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> WiX-users mailing list
> WiX-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/wix-users


-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
WiX-users mailing list
WiX-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/wix-users

Reply via email to