如何定义目录结构(路径)以用作 WorkingDirectory 属性
How to define a directory structure (path) to use as the WorkingDirectory attribute
我已经为 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 已连接,但第 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
这就是要“捕获”的目录结构:
/--Files
/----Program B
/------File1
/------File2
等等
目录结构中的故障
您的目录层次结构中似乎有错误。也许第一步尝试将其更改为如下所示:
<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
。查看缩进是什么样的。您的子文件夹应如上所示缩进。如果他们不缩进,请查看 />
条目。只有在您指出没有其他子文件夹时才添加这些。
添加您的快捷方式
至于你的捷径。以下是您应该如何将广告快捷方式添加到您安装的文件中:
<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
您可以免费安装 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,您可能需要重新安装 the latest WiX version and the Visual Studio extensions (2017) 以确保 WiX 项目类型和扩展可用。
还在学习这个论坛是如何工作的:-) post 标记我需要使用 "answer" 而不是 "comment",对吗?
这就是它的工作原理,@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 而不是只给我部署二进制文件,那就更好了:-)
作为另一个解决方法,我昨天能够使用自定义操作创建一个新的 属性。故意不是大写。
<SetProperty Id="ApplicationFullDirectory" Value="[APPLICATIONROOTDIRECTORY]Folder B" After="CostInitialize" />
这让我可以在快捷方式元素中使用新的 variable/property "ApplicationFullDirectory"。
<Shortcut Id="ApplicationStartMenuShortcut" Name="Program B" Target="[ApplicationFullDirectory]\Program B.exe" Icon="ProductIcon" WorkingDirectory="ApplicationFullDirectory"/>
但仍在学习:-)
我已经为 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 已连接,但第 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
这就是要“捕获”的目录结构:
/--Files
/----Program B
/------File1
/------File2
等等
目录结构中的故障
您的目录层次结构中似乎有错误。也许第一步尝试将其更改为如下所示:
<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
。查看缩进是什么样的。您的子文件夹应如上所示缩进。如果他们不缩进,请查看 />
条目。只有在您指出没有其他子文件夹时才添加这些。
添加您的快捷方式
至于你的捷径。以下是您应该如何将广告快捷方式添加到您安装的文件中:
<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
您可以免费安装 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,您可能需要重新安装 the latest WiX version and the Visual Studio extensions (2017) 以确保 WiX 项目类型和扩展可用。
还在学习这个论坛是如何工作的:-) post 标记我需要使用 "answer" 而不是 "comment",对吗?
这就是它的工作原理,@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 而不是只给我部署二进制文件,那就更好了:-)
作为另一个解决方法,我昨天能够使用自定义操作创建一个新的 属性。故意不是大写。
<SetProperty Id="ApplicationFullDirectory" Value="[APPLICATIONROOTDIRECTORY]Folder B" After="CostInitialize" />
这让我可以在快捷方式元素中使用新的 variable/property "ApplicationFullDirectory"。
<Shortcut Id="ApplicationStartMenuShortcut" Name="Program B" Target="[ApplicationFullDirectory]\Program B.exe" Icon="ProductIcon" WorkingDirectory="ApplicationFullDirectory"/>
但仍在学习:-)