This would definitely be a 3.0-only feature.  It will require modifications
to the WiX preprocessor.  Currently the preprocessor only allows plugins to
run after the preprocessor.  In this case, we need the extension to run
before the preprocessor.  However, since the preprocessor is based on
XmlTextReader (not XmlDocument), doing this processing before the normal
preprocessor would require a bit of a hack (ugly and a perf hit).  So I'll
probably need to re-write the preprocessor a little bit to make this work
properly.  I fear that code - it's the only thing that hasn't been rewritten
in WiX 3.0 so I guess it was due.

I'd love to get something like this working for 2.0 but the preprocessor
unfortunately just doesn't support this type of behavior and the code is
notorious for being extremely fragile.  I wouldn't dare touch it in 2.0.

Derek

-----Original Message-----
From: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] On Behalf Of Rob Hamflett
Sent: Monday, August 07, 2006 1:06 AM
To: wix-users@lists.sourceforge.net
Subject: Re: [WiX-users] rfc: pivots preprocessor extension

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 
> WixPivotsExtensionT 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


-------------------------------------------------------------------------
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