开发者

Wix Directory Problems

开发者 https://www.devze.com 2023-02-14 08:48 出处:网络
I have two questions about the directories with using fragments in Windows Installer XML. I got this fragment file from the heat.exe:

I have two questions about the directories with using fragments in Windows Installer XML.

I got this fragment file from the heat.exe:

    <?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
        <DirectoryRef Id="TARGETDIR">
            <Directory Id="dir08A07F5561FBEB6B9772467C730F6445" Name="Test" />
        </DirectoryRef>
    </Fragment>
    <Fragment>
        <ComponentGroup Id="InstallationFiles">
            <Component Id="cmp071F7F8F6B6027C8D2841272FE526A2B" Directory="dir08A07F5561FBEB6B9772467C730F6445" Guid="{CCCB70AC-29F5-4DAA-B03E-1A2266649AB6}">
                <File Id="fil63087E96FFB31F9E39B642CE8914F48B" KeyPath="yes" Source="SourceDir\dmedv.jpg" />
            </Component>
            <Component Id="cmpAE6CBEDA75641CF25BA9996AEB74A0DE" Directory="dir08A07F5561FBEB6B9772467C730F6445" Guid="{F5DABCAB-95D1-4197-A49F-E5F052A8E7EF}">
                <File Id="filD27F2F6B26F5C14563865FE6C2AD5D50" KeyPath="yes" Source="SourceDir\Files.txt" />
            </Component>
            <Component Id="cmp25C5EADB5C0A9E779D20EC7B77BD42B0" Directory="dir08A07F5561FBEB6B9772467C730F6445" Guid="{E301B04A-6EA5-496B-A58A-8898110BE57C}">
                <File Id="fil7C91C48D9AA0F2FE0EB37A21F108037F" KeyPath="yes" Source="SourceDir\readme.txt" />
            </Component>
            <Component Id="cmpD387AB4B40EDF14BF271ADDA7B71D2B7" Directory="dir08A07F5561FBEB6B9772467C730F6445" Guid="{6AF61DF4-32D0-4E7C-95B8-1DB9E7409029}">
                <File Id="fil966691BA382AFC9343430FE162643432" KeyPath="yes" Source="SourceDir\readme1.txt" />
            </Component>
            <Component Id="cmpB86212407C1BEA12838C8C7B20495E9F" Directory="dir08A07F5561FBEB6B9772467C730F6445" Guid="{921E971E-E224-464C-9FBC-FBC5F78B3E5B}">
                <File Id="fil61CD8EF43EA29DF58454E9A19F8C1EF9" KeyPath="yes" Source="SourceDir\readme2.txt" />
            </Component>
            <Component Id="cmpE4143B48FF854AE84F6054D4636FDE81" Directory="dir0ADF7E89B935DD39670130B4DC1D670E" Guid="{6F248718-93DD-4850-A18E-BD7079F738D5}">
                <File Id="fil03847B355B6AADE5E4E04D143C92BC67" KeyPath="yes" Source="SourceDir\Test2\dmedv2.jpg" />
            </Component>
        </ComponentGroup>
    </Fragment>
    <Fragment>
        <DirectoryRef Id="dir08A07F5561FBEB6B9772467C730F6445" />
    </Fragment>
    <Fragment>
        <DirectoryRef Id="dir0ADF7E89B935DD39670130B4DC1D670E" />
    </Fragment>
    <Fragment>
        <DirectoryRef Id="dir08A07F5561FBEB6B9772467C730F6445">
            <Directory Id="dir0ADF7E89B935DD39670130B4DC1D670E" Name="Test2" />
        </DirectoryRef>
    </Fragment>
</Wix>

and I have this wix installer file:

<?xml version='1.0' encoding='windows-1252'?>

<?define ProductVersion="1.0.0.0"?>
<?define ProductName="DMServices Installer"?>
<?define Manufacturer="DM EDV- und Bürosysteme GmbH"?>

<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'  xmlns:iis='http://schemas.microsoft.com/wix/IIsExtension'>
  <Product Name="$(var.ProductName)" Id='BB7FBBE4-0A25-4cc7-A39C-AC916B665220' UpgradeCode='8A5311DE-A125-418f-B0E1-5A30B9C667BD'
    Language='1033' Codepage='1252' Version="$(var.ProductVersion)" Manufacturer="$(var.Manufacturer)">

    <Package Id='*' Keywords='Installer'
      Description="DMService Installer Setup"
      Manufacturer='DM EDV- und Bürosysteme GmbH'
      InstallerVersion='100' Languages='1033' Compressed='yes' SummaryCodepage='1252' />

    <Media Id='1' Cabinet='Sample.cab' EmbedCab='yes' DiskPrompt="CD-ROM #1" />
    <Property Id='DiskPrompt' Value="the man" />

    <PropertyRef Id="NETFRAMEWORK35"/>
    <Condition Message='This setup requires the .NET Framework 3.5.'>
      <![CDATA[Installed OR (NETFRAMEWORK35)]]>
    </Condition>

   <Directory Id='TARGETDIR' Name='SourceDir'>
 开发者_开发问答     <Directory Id='ProgramFilesFolder'>
        <Directory Id='DM' Name='DM EDV'>
          <Directory Id='INSTALLDIR' Name='DMServices'>
          </Directory>
        </Directory>
      </Directory>
   </Directory>

<Feature Id='InstallationFiles' Title='InstallationFiles' Level='1'>
      <ComponentGroupRef Id='InstallationFiles' />
    </Feature>

  </Product>
</Wix>

So far.

Now when i generate this files to wixobj, the compiler shows errors because the files can't be found. The files are in a directory called "Test". And in the file it's named SourceDir.

For a lil workaround i can copy the test directory and call it SourceDir ;-). So my Setup will be created.

  1. How can I do it without a second directory?
    • EDIT: Problem is done.

Now i install my package. But whatever i do, the files will be installed to C:\Test.

But I want it to be installed in my Program Files Directory.

In many examples i can do it, like in the file, but i have to know the guids. But we do wix for getting all files from one directory, without to put our hands on.

  1. So how to install the files into the program files directory?


Take a closer look at -dr switch of heat.exe. You can put the necessary directory reference there. So, define your directory structure in the main file as you do now, and provide correct directory ID to heat.exe.

UPDATE:

Ok, the following works for me. The main directory structure:

  <Directory Id="TARGETDIR" Name="SourceDir">
     <Directory Id="INSTALLLOCATION" Name="My folder">
        <Directory Id="WebsiteFolder" Name="Website">
        ...
        </Directory>
     </Directory>
  </Directory>

The Feature references the ComponentGroup:

<Feature Id="ProductFeature" Title="!(loc.ProductFeature.Title)" Level="100">
     ...
     <ComponentGroupRef Id="WebsiteFolderComponentGroup"/>
     ...
  </Feature>

The heat.exe generates the following fragment:

    <Fragment>
        <DirectoryRef Id="WebsiteFolder">
            <Component Id="cmp1" Guid="GUID-GOES-HERE">
                <File Id="fil1" KeyPath="yes" Source="$(var.WebsiteFolderSource)\Default.aspx" />
            </Component>
            <Component Id="cmp2" Guid="GUID-GOES-HERE">
                <File Id="fil2" KeyPath="yes" Source="$(var.WebsiteFolderSource)\default.css" />
            </Component>
            <Directory Id="dir1" Name="App_Browsers">
                <Component Id="cmp3" Guid="GUID-GOES-HERE">
                    <File Id="fil3" KeyPath="yes" Source="$(var.WebsiteFolderSource)\App_Browsers\Form.browser" />
                </Component>
            </Directory>
            <Directory Id="App_Config" Name="App_Config">
                <Component Id="cmp4" Guid="GUID-GOES-HERE">
                    <File Id="fil4" KeyPath="yes" Source="$(var.WebsiteFolderSource)\App_Config\ConnectionStrings.config" />
                </Component>
            </Directory>
            <Directory Id="bin" Name="bin">
                <Component Id="cmp5" Guid="GUID-GOES-HERE">
                    <File Id="fil5" KeyPath="yes" Source="$(var.WebsiteFolderSource)\bin\MySystem.Web.UI.dll" />
                </Component>
                <Component Id="cmp6" Guid="GUID-GOES-HERE">
                    <File Id="fil6" KeyPath="yes" Source="$(var.WebsiteFolderSource)\bin\Another.dll" />
                </Component>
              ...
            </Directory>
        ...
        </Directory>

...

        <ComponentGroup Id="WebsiteFolderComponentGroup">
            <ComponentRef Id="cmp1" />
            <ComponentRef Id="cmp2" />
            <ComponentRef Id="cmp3" />
            <ComponentRef Id="cmp4" />
            ...
        </ComponentGroup>

And finally, the heat command which generates necessary output looks like this (Nant sample):

  <exec program="heat.exe" verbose="true" basedir="${paths.source}">
     <arg line='dir "${paths.dist.website}"'/><!-- Notice the quotes inside the attributes -->
     <arg line='-srd'/>
     <arg line='-dr WebsiteFolder'/>
     <arg line='-cg WebsiteFolderComponentGroup'/>
     <arg line='-out "${paths.harvest}\website.wxs"'/>
     <arg line='-ke -sfrag -scom -sreg -gg'/>
     <arg line='-var var.WebsiteFolderSource'/>
  </exec>

These snippets contain enough information to understand how it all works. Play with heat.exe switches to find out the combination you need. Good luck!


In case people like me still looking for clarification: The <DirectoryRef Id="WebsiteFolder"> in the heat fragment is important, it is the reference to where the fragment files should be installed. If you have multiple fragments and want to place it in different locations, the DirectoryRef is the key.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号