[译]:WiX Toolset使用技巧——快捷方式处理

标签: WiX Toolset, 官方教程, 中文翻译

博客分类: 官方教程

返回目录索引
原文地址:

译文地址:WiX Toolset使用技巧——快捷方式处理

在开始菜单中创建快捷方式

当我们安装应用时,在用户的开始菜单中添加启动应用的快捷方式是一个普遍需求。本节将介绍如何在开始菜单中创建快捷方式。我们假设你有一个WiX源文件,并且配置了文件内容,关于文件配置详见:译文:WiX Toolset使用技巧——文件处理

步骤1:定义目录结构

因为开始菜单快捷方式要安装在与常规应用文件不同的目录下,因此我们需要修改安装目录结构。以下WiX代码段需要放在Id值为TARGETDIR的<Directory>元素下,同时我们在为开始菜单添加目录结构信息:

<Directory Id="ProgramMenuFolder">
    <Directory Id="ApplicationProgramsFolder" Name="My Application Name"/>
</Directory>

Id值ProgramMenuFolder是一个标准的Windows安装程序属性 —— 用于指向目标机器的开始菜单文件夹。第二个目录元素在开始菜单下创建了一个名为My Application Name的子文件夹,并同时给其赋了一个Id值,以供WiX项目其他位置使用。

步骤2:添加快捷方式到安装包

使用以下三个元素将快捷方式添加到安装程序中:

  • 一个<Component>元素 —— 指定安装的最小单位
  • 一个<Shortcut>元素 —— 指定需要安装的快捷方式
  • 一个<RemoveFolder>元素 —— 确保在卸载应用程序时进行合理的清理。

以下 代码使用了步骤1中的目录结构,并创建了开始菜单快捷方式。

<DirectoryRef Id="ApplicationProgramsFolder">
    <Component Id="ApplicationShortcut" Guid="PUT-GUID-HERE">
        <Shortcut Id="ApplicationStartMenuShortcut" 
                Name="My Application Name"
                Description="My Application Description"
                Target="[#myapplication.exe]"
                WorkingDirectory="APPLICATIONROOTDIRECTORY"/>
        <RemoveFolder Id="ApplicationProgramsFolder" On="uninstall"/>
        <RegistryValue Root="HKCU" Key="Software\Microsoft\MyApplicationName" Name="installed" Type="integer" Value="1" KeyPath="yes"/>
    </Component>
</DirectoryRef>

<DirectoryRef>元素用于引用步骤1中创建的目录结构。通过引用ApplicationProgramsFolder目录,快捷方式将会安装到开始菜单的My Application Name文件夹下面。

DirectoryRef下面是一个独立的组件 —— 用于组合安装快捷方式的元素。第一个元素是Shortcut,它在开始菜单中创建 实际的快捷方式。快捷方式的Id属性值是一个唯一值。Name属性是在开始菜单中显示的文本。Description属性则是一个可选属性,它用于添加额外的应用描述。Target属性则指向磁盘 上要启动的可执行文件。注意,它通过使用[#FileId]的语法来引用完整路径,其中myapplication.exe是在之前定义的内容。WorkingDirectory属性则设置快捷方式的工作目录。

如果你需要为快捷方式设置一个可选的图标,你首先需要使用<Icon>元素将图标包含到安装包中,然后在Shortcut元素的Icon属性上引用它。

另外,添加快捷方式部件还含有另外两个重要部分。第一个部分是RemoveFolder元素,用于确保在用户卸载应用时能够从开始菜单中正确移除ApplicationProgramsFolder。第二个部分是在安装时创建一个注册表项,用于指示应用已安装。这是必需的,因为在为当前用户安装非广告的快捷方式时,快捷方式是不能作为组件的KeyPath —— 即组件需要一个KeyPath,所以添加了 一个注册表项。关于更多创建 注册表项的内容详见:原文:How To: Write a registry entry during installation

步骤3:告诉Windows安装程序要安装的快捷方式

在为安装包定义了目录结构和列出了快捷方式后,最后一步就是告诉Windows安装程序要安装的快捷方式了。我们使用<Feature>元素来处理。以下代码段添加了快捷方式组件的引用,并需要将它插入到一个Feature元素内:

<ComponentRef Id="ApplicationShortcut" />

其中<ComponentRef>元素通过Id属性来引用步骤2中创建的部件。

完整示例

下面的完整示例使用了以上的内容。此示例可以添加到WiX项目中编译,或者通过命令行编译链接,以此生成安装包:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="*" UpgradeCode="PUT-GUID-HERE" Version="1.0.0.0" Language="1033" Name="My Application Name" Manufacturer="My Manufacturer Name">
        <Package InstallerVersion="300" Compressed="yes"/>
        <Media Id="1" Cabinet="myapplication.cab" EmbedCab="yes" />

        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder">
                <Directory Id="APPLICATIONROOTDIRECTORY" Name="My Application Name"/>
            </Directory>
            <!-- Step 1: Define the directory structure -->
            <Directory Id="ProgramMenuFolder">
                <Directory Id="ApplicationProgramsFolder" Name="My Application Name"/>
            </Directory>
        </Directory>

        <DirectoryRef Id="APPLICATIONROOTDIRECTORY">
            <Component Id="myapplication.exe" Guid="PUT-GUID-HERE">
                <File Id="myapplication.exe" Source="MySourceFiles\MyApplication.exe" KeyPath="yes" Checksum="yes"/>
            </Component>
            <Component Id="documentation.html" Guid="PUT-GUID-HERE">
                <File Id="documentation.html" Source="MySourceFiles\documentation.html" KeyPath="yes"/>
            </Component>
        </DirectoryRef>

        <!-- Step 2: Add the shortcut to your installer package -->
        <DirectoryRef Id="ApplicationProgramsFolder">
            <Component Id="ApplicationShortcut" Guid="PUT-GUID-HERE">
                <Shortcut Id="ApplicationStartMenuShortcut" 
                    Name="My Application Name" 
                Description="My Application Description"
                    Target="[#myapplication.exe]"
                        WorkingDirectory="APPLICATIONROOTDIRECTORY"/>
                <RemoveFolder Id="ApplicationProgramsFolder" On="uninstall"/>
                <RegistryValue Root="HKCU" Key="Software\Microsoft\MyApplicationName" Name="installed" Type="integer" Value="1" KeyPath="yes"/>
        </Component>
        </DirectoryRef>

        <Feature Id="MainApplication" Title="Main Application" Level="1">
            <ComponentRef Id="myapplication.exe" />
            <ComponentRef Id="documentation.html" />
            <!-- Step 3: Tell WiX to install the shortcut -->
            <ComponentRef Id="ApplicationShortcut" />   
        </Feature>
    </Product>
</Wix>

创建网页的快捷方式

WiX支持在安装过程中创建网址快捷方式。本节将演示如何为你的安装程序引用必要的工具库并添加Internet的快捷方式。本节学习基础:先学习上一节的“在开始菜单中创建快捷方式”。

步骤1:为项目添加WiX工具扩展库

WiX对网页快捷方式的支持在WiX扩展库中,所以你需要先将它添加到项目中。如果你是通过命令行使用WiX,则你可以使用以下命令:

-ext WiXUtilExtension

如果你通过Visual Studio来使用Wix,则你可以使用以下步骤添加扩展引用:

  1. 在Visual Studio中打开WiX项目
  2. 在解决方案管理器中右键项目,然后选择添加引用
  3. 在列表中选择WixUtilExtension.dll程序集,然后点击添加
  4. 关闭添加 引用对话框

步骤2:为项目添加WiX工具扩展库命名空间

在将库添加到项目中后,你需要向项目中添加工具扩展库的命名空间,以便于你可以访问到相应的WiX元素。添加命名空间可以通过修改项目中的顶级<Wix>元素来处理 —— 添加如下代码:

xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"

具有标准命名空间和Utility扩展 命名空间的完整Wix元素示例如下:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
    xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">

步骤3:添加Internet快捷方式到安装包中

Intertnet快捷方式通过<Util:InternetShortcut>元素创建。下面示例展示了如何添加一个InternetShortcut元素 —— 在上一节示例基础上修改的:

<DirectoryRef Id="ApplicationProgramsFolder">
    <Component Id="ApplicationShortcut" Guid="PUT-GUID-HERE">
        <Shortcut Id="ApplicationStartMenuShortcut" 
                Name="My Application Name"
                Description="My Application Description"
                Target="[#MyApplicationExeFileId]"
                WorkingDirectory="APPLICATIONROOTDIRECTORY"/>
        <util:InternetShortcut Id="OnlineDocumentationShortcut"
                        Name="My Online Documentation"
                            Target="http://wixtoolset.org/"/>
        <RemoveFolder Id="ApplicationProgramsFolder" On="uninstall"/>
        <RegistryValue Root="HKCU" Key="Software\Microsoft\MyApplicationName" Name="installed" Type="integer" Value="1" KeyPath="yes"/>
    </Component>
</DirectoryRef>

其中InternetShortcut为Id属性设置了唯一id,并且它位于应用的开始菜单文件夹下。Name属性指定了在开始菜单中显示的快捷方式名称。Target属性指定了快捷方式指向的目标地址。<DirectoryRef>元素则用于引用在项目文件中定义的目录结构。通过引用ApplicationProgramsFolder目录,快捷方式将会被安装到用户开始菜单的My Application Name文件夹下面。

创建卸载快捷方式

当安装应用时,在开始菜单中提供卸载应用的快捷方式通常也是一个普遍需求。本节将演示在开始菜单中创建通过所有ICE验证检查的卸载快捷方式所需的步骤。

本节学习基础:已经学习如何在开始菜单中创建快捷方式 —— 本文第一部分。

步骤1:添加卸载快捷方式

使用<Shortcut>元素添加卸载快捷方式到开时菜单,同时将快捷方式指向msiexec.exe(实际调用卸载操作的Windows Installer可执行文件)。在ApplicationShortcut部件 中的任何位置添加以下内容:

<Shortcut Id="UninstallProduct"             
        Name="Uninstall My Application"
        Target="[SystemFolder]msiexec.exe"
        Arguments="/x [ProductCode]"
        Description="Uninstalls My Application" />

Target属性指向msiexec.exe位置。其中SystemFolder属性将解析为msiexec.exe所在的System32目录。Arguments属性通知msiexec.exe要卸载哪个产品 —— 通过传递ProductCode值。

为了避免在构建时的ICE验证错误,同时添加快捷方式和注册表项以及RemoveFolder元素是重要的。关于它们的描述可以看本文第一部分:在开始菜单 中创建快捷方式。

完整示例

下面的完整示例使用了以上的内容。此示例可以添加到WiX项目中编译,或者通过命令行编译链接,以此生成安装包:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="*" UpgradeCode="PUT-GUID-HERE" Version="1.0.0.0" Language="1033" Name="My Application Name" Manufacturer="My Manufacturer Name">
        <Package InstallerVersion="300" Compressed="yes"/>
        <Media Id="1" Cabinet="myapplication.cab" EmbedCab="yes" />

        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder">
                <Directory Id="APPLICATIONROOTDIRECTORY" Name="My Application Name"/>
            </Directory>
            <Directory Id="ProgramMenuFolder">
                <Directory Id="ApplicationProgramsFolder" Name="My Application Name"/>
            </Directory>
        </Directory>

        <DirectoryRef Id="APPLICATIONROOTDIRECTORY">
            <Component Id="myapplication.exe" Guid="PUT-GUID-HERE">
                <File Id="myapplication.exe" Source="MySourceFiles\MyApplication.exe" KeyPath="yes" Checksum="yes"/>
            </Component>
            <Component Id="documentation.html" Guid="PUT-GUID-HERE">
                <File Id="documentation.html" Source="MySourceFiles\documentation.html" KeyPath="yes"/>
            </Component>
        </DirectoryRef>

        <DirectoryRef Id="ApplicationProgramsFolder">
            <Component Id="ApplicationShortcut" Guid="PUT-GUID-HERE">
                <Shortcut Id="ApplicationStartMenuShortcut" 
                    Name="My Application Name" 
                Description="My Application Description"
                    Target="[#myapplication.exe]"
                        WorkingDirectory="APPLICATIONROOTDIRECTORY"/>
                <!-- Step 1: Add the uninstall shortcut to your installer package -->
                <Shortcut Id="UninstallProduct"             
                        Name="Uninstall My Application"
                        Description="Uninstalls My Application"
                        Target="[System64Folder]msiexec.exe"
                        Arguments="/x [ProductCode]"/>
                <RemoveFolder Id="ApplicationProgramsFolder" On="uninstall"/>
                <RegistryValue Root="HKCU" Key="Software\Microsoft\MyApplicationName" Name="installed" Type="integer" Value="1" KeyPath="yes"/>
        </Component>
        </DirectoryRef>

        <Feature Id="MainApplication" Title="Main Application" Level="1">
            <ComponentRef Id="myapplication.exe" />
            <ComponentRef Id="documentation.html" />
            <ComponentRef Id="ApplicationShortcut" />   
        </Feature>
    </Product>
</Wix>

译:奇葩史

没有评论