wix - 组件之间的自定义操作
问题描述
如何确保在安装两个组件之间触发自定义操作?
例如,我有一些 Wix 定义如下:
<Feature Id="ProductFeature" Title="My Installer" Level="1">
<ComponentGroupRef Id="DatabaseSetup" />
<ComponentGroupRef Id="DatabaseCleanup" />
</Feature>
<InstallExecuteSequence>
<Custom Action="RunDatabaseMigration" Before="InstallFinalize"></Custom>
</InstallExecuteSequence>
有没有办法确保自定义操作在和RunDatabaseMigration
之间正确运行?DatabaseSetup
DatabaseCleanup
我期待这样的事情,但显然我只能对 Before 和 After 属性使用标准或自定义操作的名称,此解决方案不适用于组件。
<Custom Action="RunDatabaseMigration" After="DatabaseSetup"></Custom>
解决方案
如何确保在安装两个组件之间触发自定义操作?
通常不可能在两个组件之间安排自定义操作。正如您自己已经发现的那样,Before
和After
属性必须命名标准或自定义操作。
Windows 安装程序不会一个接一个地安装一个组件。组件只是安装项目的逻辑组,例如注册表项、文件等,但它们不定义安装顺序。相反,Windows 安装程序将不同类型的资源(如注册表项和文件)分组,并按InstallExecuteSequence
表定义的顺序安装这些组。例如,在某一时刻将安装所有文件(InstallFiles
操作),然后将写入所有注册表项(WriteRegistryValues
)。看看建议InstallExecuteSequence
以获得更好的想法。
话虽如此,如果DatabaseSetup
只安装一种资源(例如文件)并DatabaseCleanup
安装另一种资源(例如注册表项),您可以在两个关联的标准操作(在本例中为InstallFiles
和WriteRegistryValues
)之间安排自定义操作。但是,如果两个组件都安装相同类型的资源或混合资源,则不能使用该解决方法。在这种情况下,您必须将其中一个组件转换为您可以随时安排的自定义操作。
推荐阅读
- php - Laravel 中的控制器
- java - 我想要一个 E 表示法双变量转到字符串,但是......?
- jquery - 如果元素的任何数据等于任何选择值
- javascript - 如何在 React 应用程序中循环和迭代一行
- scala - Spark 性能:本地比集群快(非常不均匀的执行器负载)
- php - SQL - 按大小写或 if 语句编写订单
- php - php以表格形式发送post vars
- cassandra - 如何列出 Cassandra shell 中的所有用户?
- javascript - js 正则表达式移动浏览器
- python - 1d Array Transformation:将不同大小的组分配到具有特定条件的唯一批次中