如何定义要用作WorkingDirectory属性的目录结构(路径)

时间:2018-01-24 14:33:45

标签: wix wix3.11

我已经成功为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 =&#34; C:\ ProgramFiles \ Folder A \ Folder B&#34;但它将成为&#34; C:\ ProgramFiles \ Folder B&#34;

我发现了这个: 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已加入,但第3个目录不是。

    <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

&#34;捕获&#34;:

的目录结构
/--Files
/----Program B
/------File1
/------File2

感谢任何帮助。感谢。

3 个答案:

答案 0 :(得分: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吗?试试Edit =&gt; Advanced =&gt;当您的WiX源文件打开时Format Document。看看缩进的样子。您的子文件夹应缩进,如上所示。如果他们不缩进,请查看/>条目。如果您指示没有其他子文件夹,则只添加这些。

添加快捷方式

关于你的捷径。以下是您应该如何将广告的快捷方式添加到您安装的文件中:

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

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

<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

您可以免费安装Visual Studio 2017 Community Edition - 我建议使用这种方式制作WiX MSI。您可以从该工具获得更多帮助,以避免出现诸如目录层次结构问题之类的错误。

我写了一篇关于如何创建一个最小的&#34; Hello World&#34;的简短回答。样式使用Visual Studio的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)。< / p>

答案 1 :(得分:0)

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

这就像@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而不是仅使用二进制文件来部署它会更好: - )

答案 2 :(得分:0)

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

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

这允许我使用新的变量/属性&#34; ApplicationFullDirectory&#34;在快捷方式元素中。

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

但仍在学习: - )