背景:客户一直在复制一组二进制文件并将其放在特定位置,以便他们运行NinjaTrader指标。例如:假设客户" A "使用了First.dll
,second.dll
和客户" B" 使用了First.dll
和Third.dll
(他们没有使用任何安装程序,但只是从服务器位置复制而来)
当前需求:我必须创建一个包含所有可能更新的DLL的WIX安装程序,但需要注意的是它应该只安装那些已经在其计算机上已经存在其先前版本客户的更新后的DLL。因此,如果新的WIX安装程序包含First_1000.dll
,Second_1000.dll
,Third_1000.dll
和Fourth_1000.dll
,那么它应该在客户" A"和" B" 如下:
客户" A" :使用此安装程序,他的计算机应该只有First_1000.dll
和Second_1000.dll
,而不是其他人。
客户" B" :使用此安装程序,他的计算机应该只有First_1000.dll
和Third_1000.dll
,而不是其他人。
我尝试了什么:使用 directorySearch 和 FileSearch ,但我无法有条件地安装,无论是安装全部还是安装没有。其他问题是它不会删除以前版本的二进制文件。
我需要什么:如何调用CustomAction方法并使用返回结果来决定是否安装,我可以删除该文件的先前版本。
答案 0 :(得分:2)
总体建议 :不要首先将部署作为开发任务。获取部署的文件和设置,并在应用程序启动时执行任何高级配置。
如果你需要的只是一个文件副本和一些注册表项,那么不要实现任何自定义逻辑 - 当然不能在一次使用WiX / MSI作为“shell”或“容器”的自定义操作中完成所有操作。< / p>
有许多工具可以帮助您部署软件:How to create windows installer(还列出了非MSI工具的旧工具)。
有一次我写了this step-by-step answer for a WiX installer。
如果您问我最简单的方法来实现您想要的,那么我将通过单个MSI安装所有文件并使用应用程序本身通过许可证代码调整对高级功能(如果适用)的任何访问(如果有的话) )。这可以最大限度地降低部署复杂性,并将高级功能放在熟悉的环境中:用户上下文中的应用程序调试(最有可能)。
这可以避免a world of pain of custom setup logic - sequencing
,impersonation
和conditioning
问题非常严重,更不用说runtime dependencies
和其他挑战了。总的来说,由于所有这些复杂性方面的集体影响,导致设置逻辑为very hard to debug
的整体问题。
答案 1 :(得分:0)
应该起作用的一般方法是:
将组件(每个组件包含一个文件)分组到功能中,安装后将为每个客户执行正确的操作。
根据文件搜索结果和搜索设置的属性值使用功能条件。
WiX文档中的此示例Conditional Installation似乎几乎完全符合您的要求。
从长远来看,您应该构建一个不需要此类搜索行为的设置。你不会说为什么文件名会改变,但我猜你使用不同的名字作为一种版本控制。安装,补丁,服务包,升级等都根据二进制版本替换文件。在设计良好的应用程序和安装中,现有文件的二进制版本可能都是1.0。如果新文件都是版本1.1,则将替换所有旧文件。如果一个是版本1.0(因此没有变化),它将不会被替换。文件名不会改变。版本控制是更新的基础,因此我建议朝这个方向前进。