是否可以使用 WIX 在多个地方使用相同的组件(快捷方式)?

Is it possible to use the same Component (Shortcut) in multiple places with WIX?

免责声明:由于项目要求,我被迫从我最喜欢的经过验证的真实 VS 安装项目转移到 WIX,据我所知,VS 安装项目无法满足(如所述 here) .因此,我对 WIX 真的非常陌生,所以这可能是一个非常 "duh" 的问题。

慢慢来,我正在学习如何为桌面和程序文件菜单上的主要可执行文件创建快捷方式。我已经找到了如何创建一个组件,并将其固定在包含主要文件的 ComponentGroup 中(可能是错误的移动)所以这就是我目前所拥有的:

<Fragment>
    <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
        <!-- TODO: Remove the comments around this Component element and the ComponentRef below in order to add resources to this installer. -->
        <Component Id="CMP_FooSetup">
            <File Id="FILE_Foo.exe" Source="$(var.Foo.TargetPath)" KeyPath="yes"/>
        </Component>
        <Component Id="ApplicationShortcut">
            <Shortcut
                Id="FooShortcut"
                Name="Foo"
                Description="Foos your Bar."
                Target="[#FILE_Foo.exe]"
                WorkingDirectory="APPLICATIONROOTDIRECTORY"/>
            <RegistryValue
                Root="HKCU"
                Key="Software\FooCompany\Foo"
                Name="installed" Type="integer" Value="1"
                KeyPath="yes"/>
            <RemoveFile Id="RemoveFooShortcut" Name="Foo.lnk" On="uninstall"/>
        </Component>
    </ComponentGroup>

我想要一个转到桌面的快捷方式,另一个转到程序菜单快捷方式。为此,我定义了以下文件夹结构:

<Directory Id="TARGETDIR" Name="SourceDir">
    <Directory Id="ProgramMenuFolder">
        <Directory Id="ApplicationProgramsFolder" Name="FooBar">
            <!--This is where a shortcut should be placed. How? -->
        </Directory>
    </Directory>
    <Directory Id="DesktopFolder">
        <!--This is where a shortcut should be placed. How? -->
    </Directory>
    <Directory Id="ProgramFilesFolder">
        <Directory Id="INSTALLPARENT" Name="FooBar">
            <Directory Id="INSTALLFOLDER" Name="Foo"/>
        </Directory>
    </Directory>
</Directory>

作为一名程序员,我骨子里的一切和经验(尽管可能有限)都在尖叫 "Hey, I should be able to use the ID of the Shortcut Component within the directory structures to instruct the installer to create these shortcuts!",但我不知道该怎么做。看起来应该是相当简陋的,但我的搜索没有任何结果。

这可能吗?如果是这样;如何?如果不;我应该怎么做才能完成这项工作?

请善待...

无法在多个地方(目录)使用一个组件。另一种方法是创建多个组件,将 Directory 属性从 ComponentGroup 移动到 Component 标签。

<ComponentGroup Id="ProductComponents">
    <Component Id="CMP_FooSetup" Directory="INSTALLFOLDER">
        <File Id="FILE_Foo.exe" Source="$(var.Foo.TargetPath)" KeyPath="yes"/>
    </Component>
    <Component Id="ApplicationShortcut" Directory="INSTALLFOLDER">
        <Shortcut
            Id="FooShortcut"
            Name="Foo"
            Description="Foos your Bar."
            Target="[#FILE_Foo.exe]"
            WorkingDirectory="APPLICATIONROOTDIRECTORY"/>
        <RegistryValue
            Root="HKCU"
            Key="Software\FooCompany\Foo"
            Name="installed" Type="integer" Value="1"
            KeyPath="yes"/>
        <RemoveFile Id="RemoveFooShortcut" Name="Foo.lnk" On="uninstall"/>
    </Component>
    <!-- Here I added the Directory attrib and changed the Id. -->
    <Component Id="DesktopShortcut" Directory="DesktopFolder">
        <Shortcut
            <!-- New Id -->
            Id="FooShortcutDesktop"
            Name="Foo"
            Description="Foos your Bar."
            Target="[#FILE_Foo.exe]"
            WorkingDirectory="APPLICATIONROOTDIRECTORY"/>
        <RegistryValue
            Root="HKCU"
            Key="Software\FooCompany\Foo"
            <!-- New Name -->
            Name="installed_desktop" Type="integer" Value="1"
            KeyPath="yes"/>
        <!-- New Id -->
        <RemoveFile Id="RemoveFooShortcutDesktop" Name="Foo.lnk" On="uninstall"/>
    </Component>
</ComponentGroup>

如您所问,可以更改 wxs 以将组件包含在 Directory 标记内,如下所示:

...
<Directory Id="DesktopFolder">
    <Component>
        <Shortcut ... />
    </Component>
</Directory>
...