5

我正在安装一个大型应用程序,其中一部分是一个名为“DbUpdateManager”的自定义编写工具,用于针对我们的目标数据库批量执行 SQL 脚本。

现在,WiX 2.x 安装工作正常——但它有一个缺陷:在安装过程中,我还安装了几个 Windows 服务,可以选择立即启动。但是,如果 DbUpdateManager 尚未运行,这些将失败。

所以我想要完成的是:

  1. 从我的 MSI 安装 DbUpdateManager 和我的服务
  2. 在任何服务启动之前运行 DbUpdateManager

我当前的 WiX 源代码如下所示:

<Directory Id='INSTALLDIR' Name='DbUpdMgr' LongName='DbUpdateManager' >
  <!-- DbUpdateManager component with the necessary files -->
  <Component Id='DbUpdateManagerComponent' Guid='...' DiskId='1'>
     <File Id='DbUpdateManagerFile' LongName='DbUpdateManager.Wizard.exe' 
           Name='DbUmWz.exe' src='DbUpdateManager.Wizard.exe'  KeyPath='no' />
  </Component>

  <!-- Component to install one of my Windows services -->
  <Component Id='InstallServiceComponent' Guid='...' DiskId='1'>
     <File Id='InstallServiceFile' LongName='MyService.exe' 
           Name='MyServic.exe' src='MyService.exe' KeyPath='yes'/>
     <ServiceInstall Id='InstallMyService' Name='MyService' 
                     Description='My Service' ErrorControl='normal' 
                     Start='auto' Type='ownProcess' Vital='yes' />
     <ServiceControl Id='UninstallMyService' Name='MyService' 
                     Remove='uninstall' Wait='yes' />
  </Component>

  <!-- Feature for the DbUpdateManager referencing the above component -->    
  <Feature Id='DbUpdateManager' ConfigurableDirectory='INSTALLDIR' 
           AllowAdvertise='no' Description='DbUpdateManager' Level='1' 
           Title='Database Update Manager'>
     <ComponentRef Id='DbUpdateManagerComponent'/>
  </Feature>

  <!-- Custom action for running DbUpdateManager -->    
  <CustomAction Id='RunDbUpdateManagerAction' FileKey='DbUpdateManagerFile' 
                ExeCommand='' Return='asyncWait' />

  <!-- Calling the custom action in the install sequence -->    
  <InstallExecuteSequence>
      <RemoveExistingProducts After='InstallInitialize' />
      <Custom Action='RunDbUpdateManagerAction' 
              After='InstallFinalize'>&amp;DbUpdateManager=3</Custom>

我继承了这个 WIX,它可以工作 - 但正如我所说 - DbUpdateManager 在过程中被调用得太晚(只有“After = InstallFinalize”),因此服务一开始将无法正常启动(第二次运行正常在 DbUpdateManager 运行后手动重新启动它们时左右)。

我浏览了一下 MSI 文档,发现了一个名为“StartServices”的好步骤,所以我的直觉是将调用自定义操作更改为:

   <InstallExecuteSequence>
          <Custom Action='RunDbUpdateManagerAction' 
                  Before='StartServices'>&amp;DbUpdateManager=3</Custom>

不幸的是,在这种情况下,什么都没有发生 - DbUpdateManager 永远不会被调用....

任何想法为什么?调试 MSI/WiX 的东西真的很棘手,而且我似乎再也见不到森林了......

谢谢!马克

编辑:“RunDbUpdateManagerAction”放置在我的 MSI 的 InstallExecuteSequence 表中的正确位置 - 就在 InstallServices 之后和 StartServices 之前 - 但它不起作用.... DbUpdateManager(一个 Winforms 实用程序)在期间显示安装 :-(

编辑 2:现在我的操作似乎在正确的时间执行了 - 不幸的是,我只是没有看到我的向导 :-( 我看到的是错误代码“返回值 1631”,这意味着类似于“MSI 服务”无法启动” - wtf ???

MSI (s) (2C:D8) [20:53:36:383]:执行操作:RunDbUpdateManagerAction 操作 20:53:36:RunDbUpdateManagerAction。操作于 20:53:36 开始:RunDbUpdateManagerAction。MSI (s) (2C:D8) [20:53:36:383]:执行操作:StartServices 操作 20:53:36:StartServices。服务正在启动 操作于 20:53:36 开始:StartServices。操作于 20:53:36 完成:RunDbUpdateManagerAction。返回值 1631。

4

4 回答 4

10

好吧,我终于让它工作了——在每个回复的人的帮助下,并通过咨询一些 WiX 教程和网络上的帮助页面。MSI 安装程序的东西不容易弄清楚和学习......

基本上,我将自定义操作的执行更改为“延迟”(如 Rob 建议的那样),并将执行顺序中的点移至“After=InstallFiles”。我还将 <Custom> 标记中的条件更改为“未安装”,这在我的场景中似乎工作得很好。

与 Rob 的担心相反,Db 更新管理器及其 UI 以这种方式呈现得非常好,并且更新我们的数据库的过程现在在我们的任何服务(依赖于数据库)开始之前完成。

期待 WiX 3.0(及其未来)的完整 RTM 版本!

感谢所有人——不幸的是,我只能接受一个答案——所有人都是应得的。

马克

于 2009-04-23T19:36:10.867 回答
7

您的 CustomAction 似乎取决于正在安装的“DbUpdateManagerFile”。这意味着您的 CustomAction 需要在InstallFiles 执行后安排。请记住,InstallExecuteSequence 有两次传递。首先,执行“立即”(或“预定”或“脚本生成”)操作以构建事务日志(又名:“安装脚本”)。其次,执行事务日志中的“延迟”操作。

现在您的 CustomAction 是“立即的”(默认值),因此它会在文件实际复制到机器之前尝试运行。InstallFiles 操作位于 CustomAction 之前的脚本中,但尚未执行。

因此,您需要将您的 CustomAction 标记为“延迟”,以使其在安装文件后运行。

注意:您可能无法显示延迟 CA 的 UI。我不确定你的这个工具是否应该显示 UI。

PS:对不起,如果我没有解释清楚,这是漫长的一天。

于 2009-04-23T04:39:38.727 回答
5

尝试获取安装的日志文件,并在其中查找序列顺序和执行自定义操作的条件值

在命令行中使用:msiexec /i [msiname] /l*v [filename]

编辑:阅读您的评论后,请查看此页面您可以尝试在条件中添加未安装

EDIT2:我找到了这个页面搜索你的错误号 1631

于 2009-04-22T17:34:30.603 回答
4

您可以在Orca中打开 .msi并查看 InstallExecuteSequence 表,以了解事情实际发生的顺序。这可以让您很好地了解实际发生的时间。

于 2009-04-22T17:03:40.287 回答