Wix安装包SQL脚本早于IIS应用池配置执行导致安装失败如何解决
解决方法
首先修正代码中的笔误:
你在Main.wxs中引用的IIS组件组ID是MyIISConfiguration,但ConfigureIIS.wxs里实际定义的组件组ID是SamplePortalApiIisConfiguration,先将两者改为一致,否则IIS配置不会被打包进安装程序。
最优方案:调整SQL脚本执行序列
不需要自定义动作,直接通过Wix内置的序列配置即可实现要求,操作如下:
如果你的所有SQL脚本都可以放在IIS配置完成后执行,直接在Main.wxs的Product节点下添加如下安装序列配置即可:
<InstallExecuteSequence> <!-- 将所有SQL执行动作调整到IIS配置完成后运行 --> <SqlExecute After="ConfigureIIs" /> </InstallExecuteSequence>
如果你只有部分SQL脚本依赖IIS配置,其他脚本可以提前执行,可按以下步骤拆分实现:
- 拆分SQL脚本:将不依赖IIS的脚本(如建库、表结构迁移)保留在原
SqlComponent中,将依赖IIS配置的脚本(比如为应用池标识创建数据库登录名、分配权限的脚本)单独拆分出来,定义为新的组件:
<!-- Database.wxs 新增组件 --> <Component Id="SqlComponent_IisDependent" Guid="生成新的唯一GUID"> <Condition>NOT Installed</Condition> <sql:SqlDatabase Id="SamplePortalApiDatabase" Database="[DB_DATABASE]" Server="[DB_SERVER]"> <sql:SqlScript Id="CreateLogin" ExecuteOnInstall="yes" ExecuteOnUninstall="no" BinaryKey="CreateLoginBin" ContinueOnError="no" /> <!-- 其他依赖IIS的SQL脚本都放在这里 --> </sql:SqlDatabase> <CreateFolder/> </Component>
- 调整安装序列,让新增的依赖IIS的SQL脚本在IIS配置完成后执行,同样在
Main.wxs的Product节点下添加配置:
<InstallExecuteSequence> <Custom Action="SqlScriptId=CreateLogin" After="ConfigureIIs" /> <!-- 有多个依赖脚本就按上述格式依次添加对应配置 --> </InstallExecuteSequence>
- 在
Main.wxs的Feature节点中添加新增的组件引用:
<Feature Id="ProductFeature" Title="SamplePortalApi.Setup" Level="1"> <ComponentGroupRef Id="SamplePortalApiComponents" /> <ComponentGroupRef Id="SamplePortalApiIisConfiguration" /> <ComponentRef Id="SqlComponent" /> <ComponentRef Id="SqlComponent_IisDependent" /> </Feature>
上述方案完全使用Wix内置的SQL扩展能力,不需要自定义动作,符合Wix设计规范,维护成本更低。
内容的提问来源于stack exchange,提问作者jimbo
相关产品推荐
相关产品推荐

