【问题标题】:How to define a directory structure (path) to use as the WorkingDirectory attribute如何定义目录结构(路径)以用作 WorkingDirectory 属性
【发布时间】:2020-11-03 19:31:32
【问题描述】:

我已经为 PyCharm 成功创建了一个 MSI,因为安装程序在静默模式下无法正常工作。于是我有了第一次成功的 WiX 体验。

现在,我从我们的开发人员那里得到了一个要安装的文件夹。 该程序应转到“C:\ProgramFiles\Folder A\Folder B” 因为稍后会有另一个包到“C:\ProgramFiles\Folder A\Folder C”

所以,这就是我得到的(部分):

<Directory Id="TARGETDIR" Name="SourceDir">
    <Directory Id="ProgramFilesFolder">
        <Directory Id="APPLICATIONROOTDIRECTORY" Name="Folder A"/>
        <Directory Id="APPLICATIONSUBDIRECTORY" Name="Folder B"/>
    </Directory>

    <Directory Id="ProgramMenuFolder">
        <Directory Id="ApplicationProgramsFolder" Name="Program B"/>
    </Directory>
</Directory>

我现在正在尝试创建快捷方式

<Shortcut Id="ApplicationStartMenuShortcut" Name="Program B" Target="[APPLICATIONSUBDIRECTORY]\Program B.exe" Icon="ProductIcon" WorkingDirectory="APPLICATIONSUBDIRECTORY"/>

所以,我的意图是 APPLICATIONSUBDIRECTORY = "C:\ProgramFiles\Folder A\Folder B" 但它将是 "C:\ProgramFiles\Folder B"

我发现了这个: Setting Wix shortcut with environment variable workingdirectory

但如果已经有目录结构,我宁愿不使用其他属性。

抛开这个:

<Directory Id="APPLICATIONSUBDIRECTORY" Name="Folder B"/>

使用 APPLICATIONROOTDIRECTORY 可以,但我需要第二层文件夹。

Target 属性也不喜欢这样。 使用(变量的组合)

Target="[APPLICATIONROOTDIRECTORY]\[APPLICATIONSUBDIRECTORY]\Program B.exe"

没用,但是

Target="[APPLICATIONROOTDIRECTORY]\Folder B\Program B.exe"

会。

由于我是 WiX 的新手,我仍在努力定义目录。 前 2 个目录 ID 已加入,但第三个未加入。

<Directory Id="ProgramFilesFolder">
    <Directory Id="APPLICATIONROOTDIRECTORY" Name="Folder A"/>
    <Directory Id="APPLICATIONSUBDIRECTORY" Name="Folder B"/>
</Directory>

这是我的批处理文件:

@echo off
SET WIXPATH=C:\Program Files (x86)\WiX Toolset v3.11\bin
SET COMPONENTGROUP=MyCompGroup
SET FILEFOLDER=Files
SET FILELIST=FileList
SET MAINFILE=Main
SET MSINAME=Program B.msi

if exist FileList.wxs del FileList.wxs
if exist *.wixobj del *.wixobj
if exist *.wixpdb del *.wixpdb
if exist *.msi del *.msi
if exist *.cab del *.cab
pause

"%wixpath%\heat.exe" dir ".\%FILEFOLDER%" -cg %COMPONENTGROUP% -dr APPLICATIONROOTDIRECTORY -out %FILELIST%.wxs -gg -ke -srd -sfrag -template fragment

"%wixpath%\candle.exe" -arch x86 %MAINFILE%.wxs %FILELIST%.wxs

"%wixpath%\light.exe" -b %FILEFOLDER% -out "%MSINAME%" %MAINFILE%.wixobj %FILELIST%.wixobj

这就是“捕获”的目录结构:

/--Files
/----Program B
/------File1
/------File2

等等

【问题讨论】:

  • 您需要将“文件夹 B”作为“文件夹 A”的子目录吗?
  • 是的,先生! :-) 文件夹 B 确实存在于要捕获的结构中。文件夹 A 在 WiX 文件中定义。

标签: wix wix3.11


【解决方案1】:

目录结构中的故障

您的目录层次结构中似乎存在错误。第一步可能尝试将其更改为如下所示:

<Directory Id="TARGETDIR" Name="SourceDir">

  <Directory Id="ProgramFilesFolder">
    <Directory Id="APPLICATIONROOTDIRECTORY" Name="Folder A">
      <Directory Id="APPLICATIONSUBDIRECTORY" Name="Folder B" />
    </Directory>
  </Directory>

  <Directory Id="ProgramMenuFolder">
    <Directory Id="ApplicationProgramsFolder" Name="Program B" />
  </Directory>

</Directory>

您使用的是 Visual Studio 吗?当您打开 WiX 源文件时,尝试使用 Edit => Advanced => Format Document。看看缩进是什么样子的。您的子文件夹应如上所示缩进。如果他们不缩进,请查看 /&gt; 条目。仅当您指出没有其他子文件夹时才添加这些。

添加快捷方式

至于您的快捷方式。以下是您应该能够向您安装的文件添加广告快捷方式的方法:

<Shortcut Id="mysc" Advertise="yes" Directory="ApplicationProgramsFolder" 
          Name="My Shortcut" Description="My Shorcut Description" />

应将此快捷方式元素添加到安装相关文件的组件中,例如:

<Component Id="NOTEPAD.EXE" Feature="ProductFeature">

   <File Source="MyReleaseFiles\NOTEPAD.EXE" />

   <Shortcut Id="mysc" Advertise="yes" Directory="ApplicationProgramsFolder" 
             Name="My Shortcut" Description="My Shorcut Description" />

   <RemoveFolder Id="ApplicationProgramsFolder" On="uninstall"
                 Directory="ApplicationProgramsFolder"/>

</Component>

视觉工作室

您可以免费安装Visual Studio 2017 Community Edition - 我推荐这种方式来制作 WiX MSI。您可以从该工具中获得更多帮助,以避免出现目录层次结构问题等错误。

我写了一个关于如何使用 Visual Studio 创建最小的“Hello World”风格的 WiX MSI 的简短答案: WiX installer msi not installing the Winform app created with Visual Studio 2017.

如果您安装 Visual Studio 以确保 WiX 项目类型和扩展可用,您可能需要重新安装 the latest WiX version和 Visual Studio 扩展 (2017)。

【讨论】:

  • 感谢您的回复。我正在使用 Visual Studio Code 和当前的 WiX 3.11。这就是为什么我将我的问题标记为“wix3.11”。使用您正确的目录:我需要小心终止“/>”。我让它工作。至于快捷方式,它正在工作。唯一的问题是路径,因为快捷方式元素不接受变量组合。现在目录结构正常工作,我可以在快捷方式元素中使用新变量(包含整个路径)。
【解决方案2】:

还在学习这个论坛的工作原理 :-) 要发布标记,我需要使用“回答”而不是“评论”,对吧?

这就是它的工作方式,就像@Stein Åsmul 写道:

I split every directory element into <Directory> and </Directory> instead of just <Directory />.
I know it's not necessary for the "last" one but just to make it clear for me next time I look at that code :-)

<Directory Id="TARGETDIR" Name="SourceDir">
    <Directory Id="ProgramFilesFolder">
        <Directory Id="APPLICATIONROOTDIRECTORY" Name="Folder A">
            <Directory Id="APPLICATIONSUBDIRECTORY" Name="Folder B">
            </Directory>
        </Directory>
    </Directory>

    <Directory Id="ProgramMenuFolder">
        <Directory Id="ApplicationProgramsFolder" Name="Program B">
        </Directory>
    </Directory>
</Directory>

快捷方式部分是这样工作的:

<DirectoryRef Id="ApplicationProgramsFolder">
    <Component Id="ApplicationShortcut" Guid="*PUT-IN-GUID*">
        <Shortcut Id="ApplicationStartMenuShortcut" Name="Program B" Target="[APPLICATIONSUBDIRECTORY]\Program B.exe" Icon="ProductIcon" WorkingDirectory="APPLICATIONSUBDIRECTORY"/>
        <RemoveFolder Id="ApplicationProgramsFolder" On="uninstall"/>
        <RegistryValue Root="HKCU" Key="Software\[blabla]\Program B" Name="installed" Type="integer" Value="1" KeyPath="yes"/>
    </Component>
</DirectoryRef>

这并不完美,但比通过批处理文件复制整个废话要好得多... 如果我们的开发人员使用 WiX 而不是只给我二进制文件来部署,那就更好了:-)

【讨论】:

    【解决方案3】:

    作为另一种解决方法,我昨天能够使用自定义操作创建一个新属性。不是故意大写的。

    <SetProperty Id="ApplicationFullDirectory" Value="[APPLICATIONROOTDIRECTORY]Folder B" After="CostInitialize" />
    

    这让我可以在快捷方式元素中使用新的变量/属性“ApplicationFullDirectory”。

    <Shortcut Id="ApplicationStartMenuShortcut" Name="Program B" Target="[ApplicationFullDirectory]\Program B.exe" Icon="ProductIcon" WorkingDirectory="ApplicationFullDirectory"/>
    

    但仍在学习:-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-02
      • 1970-01-01
      • 2012-07-07
      • 2017-12-17
      • 2021-02-11
      • 2011-03-23
      • 2023-03-18
      相关资源
      最近更新 更多