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