在我的WIX项目中,我有一个像这样的目录结构:
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="INSTALLLOCATION" Name="FolderName">
...
</Directory>
<Directory Id="MYDIRECTORY" Name="SomeDifferentDirectory">
...
</Directory>
</Directory>
这里INSTALLLOCATION
表示我的程序的安装文件夹,但是我想另外创建一个位于安装目录之外的目录,例如D:\MyFolder1\MyFolder2
,从上面的示例我怎么能分配这个值为MYDIRECTORY
,以便在安装完成后创建它?
答案 0 :(得分:5)
我没有时间测试下面列出的选项,但它们应该是可行的技术可能性。希望其中一个选项会令人满意。
但是,首先:我不喜欢这种设置辅助顶级目录的方法 - 它真的需要吗?你能解释一下这个场景吗?也许有更可靠的方式?
请参阅&#34; 替代方案?&#34;我认为这是一个更好的方法而不是&#34;摆弄&#34;目录属性。如果我是你,我会读到这个&#34;替代品?&#34;第一节 - 也许它可以为你节省很多麻烦?
但是,第一部分涉及各种技术选项,以满足您的要求:
有许多方法可以设置目录属性。正如我所说的,我还没有&#39;吨有时间来检验这些选项 - 它总是疯狂张贴未经检验的建议,但你似乎喜欢一个人,谁可以帮助自己与一些指针:
[ROOTDRIVE]MyFolder
。
[WindowsVolume]MyFolder
- 可能确实有效,但我个人并不喜欢。我想首先没有安装到系统驱动器上的顶级文件夹。SetDirectory Element
这个&#34;设置属性&#34;目的。我认为它可以帮助您完成所有自定义操作。一些自动魔术。但我不确定此功能是否允许从命令行覆盖PUBLIC PROPERTIES?D:\MyFolder
,则必须注意此路径可能会在某个时刻意外丢失(驱动器已从系统中删除,新驱动器已添加(?),添加了新的DVD驱动器(?),驱动器手动改变字母等...)。
PersonalFolder
(我的文档),然后将其重定向到Windows本身的D:\。我相信如果在启动时找不到,Windows会为PersonalFolder
分配一个新值。然后,Windows Installer仍然可以枚举目标文件夹,而不仅仅是卡住或崩溃。将目录设置为安装程序GUI中自定义对话框中公开的功能目录。
ConfigurableDirectory
的{{1}}属性设置为等于保存目录路径的PUBLICPROPERTY。FeatureElement
),您现在应该能够从WiX GUI设置此目录 - 来自&#34; 自定义强>&#34;对话。有一个循序渐进的示例使用Visual Studio更新WiX源文件以在此处使用Mondo:WiX installer msi not installing the Winform app created with Visual Studio 2017。<UIRef Id="WixUI_Mondo" />
的属性。常规,即时模式自定义操作(不是设置属性自定义操作),通过调用 Session.Property =&#34设置属性; someValue中&#34;代码中的某个地方。每种类型的自定义操作类型执行此操作&#34;属性设置&#34;略有不同(自定义操作类型:VBScript,C ++,DTF / C#等等...... See documentation from Advanced Installer,了解如何做到这一点。)
有些人甚至在属性表中使用硬代码路径,或使用set属性自定义操作在运行时将ConfigurableDirectory
分配给属性 - 根本不可接受。 这会打破 - 这只是一个时间问题。在没有C:\驱动器的计算机上,它根本不会安装 - 对于初学者来说。
不确定在C:\
和directory resolution
期间是否会覆盖属性表中设置的此类属性 - 我从未打扰过尝试 - 这不是解决方案而我只是想要说明要防止其使用。
分配costing
或类似属性的设置属性自定义操作似乎有效,但会以意想不到的方式爆炸。保证。
同样:如果您可以提供帮助,请不要部署到单独的顶级文件夹。
我听说有些人 - 在企业标准化环境中 - 使用环境变量来定义此类安装文件夹。我从未将它用于生产,从未尝试过进行测试,也不喜欢它作为一种选择。
请记住,可以在命令提示符下设置公共属性 - 因此可能会覆盖您添加的任何逻辑以自行设置它。也许添加自定义操作来检查来自命令行的值,并接受它或者如果错误则中止设置。
以下是具有可配置功能目录的WiX安装程序的GUI屏幕截图:
上面的浏览按钮仅适用于指定C:\
属性指向自定义目录属性的功能(忽略上面屏幕截图中的ConfigurableDirectory
条目 - 只是打嗝):
C:\
在WiX源的其他地方,实际的可配置目录:
<!-- 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>
我会使用额外的自定义操作来默认此<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>
目录,或者检查用户对有效性的选择。这不完全是直截了当的,但必须在每种情况下处理。
第二个想法,我可能会使用MYCUSTOMDIR
将MYCUSTOMDIR目录默认为set property custom action
的子文件夹,然后允许用户在安装时覆盖它。现在您必须回读用户在修改和修复(以及其他安装模式)上的选择,否则您将默认为PersonalFolder
以及您在其他安装模式中指定的任何子文件夹。您可以在注册表中保留用户文件夹选择,并使用PersonalFolder
(我认为的大多数专业人员的偏好)将其读回,或者在自定义操作中完成所有操作。在所有安装模式下使其正常工作可能具有挑战性。做好测试。
技术挑战:如果您在注册表中保留AppSearch
的原始文件夹选择并使用MYCUSTOMDIR
将其读回,则必须确保调整您的设置属性自定义action(如果未设置任何值,则用于将默认值设置为AppSearch
),以便在属性已从注册表中检索值时它不会运行。不是火箭科学,但可以很好地做到正确 - 并且在所有安装模式中挑剔测试。如果你依赖标准结构而不是自定义动作,一旦你理解了移动部件,你通常会受益。涉及 - 首先你默认第一次安装,因为还没有设置值(除非通过命令行设置一个值),然后你允许它在GUI(或命令行)中被覆盖,然后你在注册表中保持安装,在下次启动(修复,修改,自修复,升级,补丁)时,您回读持久值并且不要通过条件等设置默认值...
投入保管的链接:Wix : Disable control in built-in dialog。
如上所述,通常可以通过更好地理解替代方案来避免这些辅助顶级目录层次结构。
检查替代方案的一些问题: