Using WiX Toolset 3.10, and trying to create shortcuts to certain files that have been harvested with the heat.exe utility, as by:
"%WIX%\bin\heat.exe" dir SourceDir -nologo -platform x64 ^
-ke -gg -g1 -suid -srd -scom -sreg -dr INSTALLDIR ^
-cg ProjFiles -out ProjFiles.wxs
My issues:
I know by now that I'm supposed to use an XSLT file to transform ProjFiles.wxs (the
-t
option in heat.exe) but WiX-specific documentation on how to write it is non-existent: can someone please provide an example that adds aShortcut
on the Desktop for anId
of "Prog.exe"?Because of the
-g1
flag, files which share the same basename (e.g. "SourceDir\dirA\file.txt" and "SourceDir\dirZ\file.txt") will share the sameId
(i.e. "file.txt"); how come this isn't a conflict, seen how the .MSI builds and runs OK?
The WiX-specific information is documented but learning just enough XSL is a bit of a challenge. This should get you started. You might have to adapt to your names, heat arguments, etc.
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet
version="1.0"
xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wix="http://schemas.microsoft.com/wix/2006/wi"
xmlns:str="http://xsltsl.org/string"
exclude-result-prefixes="wix str"
>
<xsl:output
encoding="utf-8"
method="xml"
version="1.0"
indent="yes"
/>
<xsl:template match='wix:Component[contains(wix:File/@Source, "SourceDir\Prog.exe")]'>
<!-- assumes there is only one Prog.exe -->
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<xsl:comment> added shortcut under Component with File that has Source with Prog.exe </xsl:comment>
<!-- Elsewhere, have an Icon element like: <Icon Id="Prog.exe" SourceFile="$(var.BUILDCACHE)Bin/Prog.exe" /> -->
<Shortcut
Id="ProgExeShortcut"
Name="Prog Application"
Icon="Prog.exe"
Directory="ProgramMenuFolder_ProgVendor"
Advertise="yes">
<xsl:attribute name="WorkingDirectory"><xsl:value-of select="@Directory"/></xsl:attribute>
</Shortcut>
<RemoveFolder
Id="ProgExeShortcut_ProgramMenuFolder_ProgVendor"
Directory="ProgramMenuFolder_ProgVendor"
On="uninstall" />
</xsl:copy>
</xsl:template>
<!-- identity template -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match='/'>
<xsl:comment>*** DO NOT EDIT: Generated by heat.exe; transformed by ProgComponentGroup.xsl</xsl:comment>
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
</xsl:stylesheet>
More specific and earlier templates match before more general or later ones. So, the base is to copy every element, attribute, text and comment AS IS, except the ones you want to change. For the ones you want to change, you reconstruct everything—in this case by copying everything the Component element had and then adding the Shortcut and RemoveFolder elements.
This should get it making a shortcut on the desktop. You'll get a ICE warning because the shortcut isn't in the same component as the Prog.exe file's component but it is safe to ignore (if you have warnings treated as errors, add the ICE to the Suppress specific ICE validations list. (wixproj properties Tool Settings in visual studio. <SuppressIces>
tag in the wixproj. Or, -sice:ICE## in cmd line)
Define your DesktopFolder in the directory definitions
<Directory Id="TARGETDIR" Name="SourceDir">
...
<Directory Id="DesktopFolder"/>
...
</Directory>
then have a component
<Component Id="ProgDesktopShortcut">
<Shortcut
Id="ProgDesktopShortcut"
Directory="DesktopFolder"
Target="[#Prog.exe]"
Name="Prog Shortcut"
WorkingDirectory="INSTALLDIR" >
</Shortcut>
<RegistryValue
Id="ProgDesktopRegShortcut"
Root="HKCU"
Key="SOFTWARE\Prog\"
Name="ProgInstall"
Type="integer"
Value="1"
KeyPath="yes"/>
</Component>
来源:https://stackoverflow.com/questions/41140034/how-to-create-shortcuts-to-files-harvested-by-heat-exe