wix - WIX 条件 SQL 脚本执行不起作用
问题描述
我正在创建一个新的 WIX 安装程序。安装基于客户现有的数据库。在第一次安装时,我只在数据库中拥有已安装功能的信息。所以我必须从中查询这些功能,安装程序不应该执行它的激活脚本。每个功能都有一个属性,我通过自定义操作设置了这些属性,但条件 SQL 脚本执行不起作用。我创建了一个示例 wxs 源文件。你能帮我看看有什么问题吗?
<?xml version='1.0' encoding='UTF-8'?>
<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi' xmlns:util='http://schemas.microsoft.com/wix/UtilExtension' xmlns:sql='http://schemas.microsoft.com/wix/SqlExtension'>
<!-- https://wixtoolset.org/documentation/manual/v3/xsd/wix/product.html -->
<Product Id='BC075295-7BB8-4B82-89AC-3F81681130CC' Name='XXX' UpgradeCode='4AD0BCB8-B1BB-4FE1-ABEE-58E93321AAC5' Language='1033' Codepage='1252' Version='1.0.0' Manufacturer='XXX'>
<Package Id='*' Keywords='Installer' Description="XXX Installer" InstallerVersion='100' Languages='1033' Compressed='yes' SummaryCodepage='1252'/>
<Media Id='1' Cabinet='Andoc.cab' EmbedCab='yes' />
<Binary Id="WixCustomActions" SourceFile="CustomAction.CA.dll" />
<Binary Id="sqlScriptBinaryKey" SourceFile="insert.sql" />
<CustomAction Id="SetExecuteScriptCondition" BinaryKey="WixCustomActions" DllEntry="SetExecuteScriptCondition" Execute="immediate" Return="check" />
<Property Id="EXECUTE_SCRIPT" Value="NO" />
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="INSTALLDIR" Name="XXX" />
</Directory>
<Component Id="componentSqlScript" Directory="INSTALLDIR" Guid="1af938ef-6788-a0e1-2370-a6c2620c9dCC">
<Condition>EXECUTE_SCRIPT = "YES"</Condition>
<sql:SqlDatabase Id="db" Database="[DATABASE_NAME]" Server="[DATABASE_SERVER]" CreateOnInstall="yes" DropOnUninstall="no" ContinueOnError="no">
<sql:SqlScript Id="SqlScriptId" BinaryKey="sqlScriptBinaryKey" ExecuteOnInstall="yes" ExecuteOnUninstall="no" ContinueOnError="no" />
</sql:SqlDatabase>
<CreateFolder />
</Component>
<Feature Id="feature" Title="xxx" Description="xxx" ConfigurableDirectory="INSTALLDIR" Level="1">
<ComponentRef Id="componentSqlScript" />
</Feature>
<InstallExecuteSequence>
<Custom Action='SetExecuteScriptCondition' Before='InstallInitialize' />
</InstallExecuteSequence>
<UI>
<UIRef Id="WixUI_Mondo" />
</UI>
</Product>
</Wix>
我的自定义操作如下所示。
[CustomAction]
public static ActionResult SetExecuteScriptCondition(Session session)
{
session["EXECUTE_SCRIPT"] = "YES";
return ActionResult.Success;
}
在日志中,我看到 EXECUTE_SCRIPT 属性值为“YES”,但未执行 insert.sql 脚本。
解决方案
InstallInitialize
为时已晚,因为在成本计算期间评估了组件“componentSqlScript”的条件。这就是设置该属性似乎不起作用的原因。
您需要在“CostInitialize”之前安排您的操作,在 UI 和 Execute 序列中对其进行排序(因为 UI 序列不一定运行,并且如果在 UI 序列中也执行了成本计算,那么执行序列将太迟)。您应该添加Execute="firstSequence"
到您的CustomAction
元素中,并且应该添加Secure="yes"
到您的Property
元素中,以防止过度运行代码并防止公共属性值并不总是设置为执行序列的问题。
推荐阅读
- c++ - 错误:'GenericEnclosure::GenericEnclosure' 命名构造函数,而不是类型
- git - 为什么 Git rebase 不像 Darcs 那样需要指数级的时间?
- typescript - 如何禁用生成“exports.__esModule = true;” 和“要求(“lib”);”
- sql - 选择仅在其中 3 个中具有不同的多个列
- python - 如果一个项目存在于一个列表中,而不是另一个列表中,则产生一些输出
- python - Python:基本项目结构和导入路径
- javascript - IOS 应用环境中是否有与 JavaScript 窗口对象等价的对象?
- python - 查找在“如果有”方法中找到的字符串的索引
- dialogflow-es - 预期输入 [0] 处的 MalformedResponse:如果这不是最终响应,则响应必须提供至少一个可能的意图。这是什么意思?
- javascript - 如何在javascript中调用图像