Myk*_*ych 0 windows-installer wix wix3.11
在我的WIX项目中,我有一个像这样的目录结构:
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="INSTALLLOCATION" Name="FolderName">
...
</Directory>
<Directory Id="MYDIRECTORY" Name="SomeDifferentDirectory">
...
</Directory>
</Directory>
Run Code Online (Sandbox Code Playgroud)
这里INSTALLLOCATION代表我程序的安装文件夹,但是我想另外创建另一个安装目录之外的目录,例如D:\MyFolder1\MyFolder2,从上面的例子中我如何分配这个值,MYDIRECTORY以便在安装完成后创建它?
我没有时间测试下面列出的选项,但它们应该是可行的技术可能性.希望其中一个选项会令人满意.
但是,首先:我不喜欢这种设置辅助,顶级目录的方法 - 它真的需要吗?你能解释一下这个场景吗?也许有更可靠的方式?
请参阅底部的" 替代方案? "部分,我认为这是一种比使用目录属性"摆弄"更好的方法.如果我是你,我会读到这个"替代品?" 第一部分 - 也许它为您省去了很多麻烦?
但第一部分涉及各种技术选项,以满足您的要求:
有很多方法可以设置目录属性.正如我所说,我没有时间测试这些选项 - 发布未经测试的建议总是很疯狂,但你似乎可以帮助自己一些指点:
[ROOTDRIVE]MyFolder.
[WindowsVolume]MyFolder- 实际上可能有用,但我个人并不喜欢它.我想首先没有安装到系统驱动器上的顶级文件夹.SetDirectory Element这种"固定属性"的目的.我认为它可以帮助您完成所有自定义操作.一些自动魔术.但是我不确定此功能是否允许从命令行覆盖PUBLIC PROPERTIES?D:\MyFolder你必须要知道这个路径可能在某些时候意外丢失(驱动器从系统中删除,新驱动器添加(?),添加新的DVD驱动器(?),手动更改驱动器号等等... ).
PersonalFolder(我的文档),然后将其重定向到Windows本身的D:\.我相信Windows会PersonalFolder在启动时找不到新值.然后,Windows Installer仍然可以枚举目标文件夹,而不仅仅是卡住或崩溃.将目录设置为安装程序GUI中自定义对话框中公开的功能目录.
ConfigurableDirectory属性设置为FeatureElement等于保存目录路径的PUBLICPROPERTY.<UIRef Id="WixUI_Mondo" />) - 从" 自定义 "对话框,您现在应该能够从WiX GUI设置此目录.有一个循序渐进的示例使用Visual Studio更新WiX源文件以在此处使用Mondo:WiX安装程序msi没有安装使用Visual Studio 2017创建的Winform应用程序.ConfigurableDirectory为该功能的属性.一种常规的即时模式自定义操作(不是设置属性自定义操作),它通过在代码中的某处调用Session.Property ="SomeValue" 来设置属性.每种类型的自定义操作类型都会稍微不同地执行此"属性集"(自定义操作类型:VBScript,C++,DTF/C#等等... 请参阅Advanced Installer中的文档,了解如何执行此操作).
有些人甚至在属性表中硬编码路径,或者使用set属性自定义操作C:\在运行时分配给属性 - 完全不可接受.这将打破 - 这只是一个时间问题.在没有C:\驱动器的计算机上,它根本不会安装 - 对于初学者来说.
不确定在属性表中设置的这样的属性是否会被覆盖directory resolution并且costing- 我从未打扰过尝试 - 它不是解决方案,我只是想说明它以防止它的使用.
分配C:\或类似于属性的设置属性自定义操作似乎可以正常工作,但会以意想不到的方式爆炸.保证.
再次:如果您可以提供帮助,请不要部署到单独的顶级文件夹.
我听过一些人 - 在公司的标准化环境中 - 使用环境变量来定义这样的安装文件夹.我从未将它用于生产,从未尝试过进行测试,也不喜欢它作为一种选择.
请记住,可以在命令提示符下设置公共属性 - 因此可能会覆盖您添加的任何逻辑以自行设置它.也许添加自定义操作来检查来自命令行的值,并接受它或者如果错误则中止设置.
以下是具有可配置功能目录的WiX安装程序的GUI屏幕截图:
上面显示的浏览按钮仅适用于ConfigurableDirectory指定属性指向自定义目录属性的功能(忽略C:\上面屏幕截图中的条目 - 只是打嗝):
<!-- A standard feature -->
<Feature Id="ProductFeature" Title="MinimalShortcutTester" Level="1">
<ComponentGroupRef Id="ProductComponents" />
</Feature>
<!-- A configurable directory feature -->
<Feature Id="FeatureDirectory" Title="FeatureDirectory" ConfigurableDirectory="MYCUSTOMDIR">
<!-- your stuff here -->
</Feature>
Run Code Online (Sandbox Code Playgroud)
在WiX源的其他地方,实际的可配置目录:
<Directory Id="MYCUSTOMDIR">
<!-- Mock-up GUID that MUST be changed, custom target directories do not function with auto-GUIDs -->
<Component Id="MyFile.exe" Guid="{00000000-0000-0000-0000-000000000000}" Feature="FeatureDirectory">
<File Source="C:\SourceControl\MyFile.exe" />
</Component>
</Directory>
Run Code Online (Sandbox Code Playgroud)
我会使用额外的自定义操作来MYCUSTOMDIR很好地默认此目录,或者检查用户对有效性的选择.这不完全是直截了当的,但必须在每种情况下处理.
再想一想,我可能会使用a set property custom action将MYCUSTOMDIR目录默认为子文件夹PersonalFolder,然后允许用户在安装时覆盖它.现在您必须回读修改和修复(以及其他安装模式)上的用户选择,否则您将默认使用PersonalFolder您在其他安装模式中指定的子文件夹.您可以在注册表中保留用户文件夹选择,并使用AppSearch(我认为的大多数专业人员的偏好)将其读回,或者在自定义操作中完成所有操作.在所有安装模式下使其正常工作可能具有挑战性.做得好测试.
技术挑战:如果您MYCUSTOMDIR在注册表中保留原始文件夹选择并将其读回AppSearch,则必须确保调整set属性自定义操作(MYCUSTOMDIR如果未设置任何值,则用于设置默认值),以便它不会如果属性已从注册表中检索值,则运行.不是火箭科学,但可以很好地做到正确 - 并且在所有安装模式中挑剔测试.如果您依赖标准结构而不是自定义操作,一旦您理解了所涉及的"移动部件",您通常会受益 - 首先您在第一次安装时默认,因为尚未设置任何值(除非通过命令行设置了值),然后您允许它在GUI(或命令行)中被覆盖,然后你在安装期间,在下次启动(修复,修改,自修复,升级,补丁)时保留在注册表中,你读回持久值并且不要让它默认值通过条件等设置...
投入一个用于保管的链接:Wix:在内置对话框中禁用控件.
如上所述,通常可以通过更好地理解替代方案来避免这些辅助顶级目录层次结构.
有些问题需要检查替代方案:
| 归档时间: |
|
| 查看次数: |
1768 次 |
| 最近记录: |