3

伙计们,

我们在安装 MSI 时遇到了一些排序问题。作为我们应用程序的一部分,我们安装了一系列服务,并允许用户选择是立即启动它们还是稍后启动它们。

当它们立即启动时,它们似乎在安装序列中启动得太早 - 在我们的数据库管理器有机会更新数据库之前。

现在,我们运行数据库更新程序的自定义操作看起来像这样——它在“InstallFinalize”之后运行——在这个过程中很晚。

   <InstallExecuteSequence>
      <RemoveExistingProducts After='InstallInitialize' />
      <Custom Action='RunDbUpdateManagerAction' After='InstallFinalize'>
           DbUpdateManager=3</Custom>
   </InstallExecuteSequence>

为了确保在任何已安装的服务启动之前执行数据库脚本,在之后或之前运行更合适的步骤是什么?是否有“BeforeServiceStart”步骤?

编辑:

仅仅在标签上定义“Before='StartServices'”属性并不能解决我的问题。

我假设问题是这样的:自定义操作有一个“内部文本”,它代表一个条件,这个条件是:“&DbUpdateManager=3”。从我可以从试验和错误中推断出来,这可能意味着“必须发布 DbUpdateManager 功能”。

现在,问题是:“PublishFeature”出现在安装序列的最后,就在“InstallFinalize”之前,而且肯定在 InstallServices / StartServices 之后。因此,当我指定“Before=StartServices”要求时,“必须发布 DbUpdateManager 功能”条件还不成立,因此 DbUpdateManager 不会被执行:-(

我尝试删除条件 - 在这种情况下,我的 DbUpdateManager 有时根本不执行,有时不止一次 - 没有真正明确的模式来说明什么时候会发生......

还有什么想法吗??有没有一种方法可以检查“安装了 DbUpdateManager 功能”的条件,这在“InstallFiles”步骤之后是否正确?

马克

4

2 回答 2

1

没有BeforeServiceStart,但你可以试试Before='StartServices'

于 2009-03-25T20:47:42.543 回答
1

好吧,看来 marc_s 在另一个问题中得到了答案。但是,由于我的解决方案略有不同,并且另一个问题需要进行一些重构才能获得解决方案,因此这正是对我有用的方法:

...
<InstallExecuteSequence>
  <Custom Action="CopyConfigs" 
          After="InstallFiles"><![CDATA[&ProductFeature = 3]]></Custom>
</InstallExecuteSequence>
<CustomAction Id="CopyConfigs"
              FileKey="copySamples"
              ExeCommand=""
              Execute="deferred"
              Impersonate="no"/>

<Directory Id="TARGETDIR" Name="SourceDir">
...
  <Directory Id="Config" Name="Config">
    <Component Id="ShippedConfigs" Guid="{8E6344C8-2B3F-4654-8B42-C09E76200052}">
      <File Id="copySamples"
            Source="$(var.ProjectDir)config\Copy.Configs.Sample.cmd"
            KeyPath="no"
            DiskId="1" />
    </Component>
  </Directory>
</Directory>

<Feature Id="ProductFeature" Title="MyService" Level="1">
  <ComponentRef Id="ShippedConfigs" />
  ...
</Feature>
于 2010-04-22T18:38:53.680 回答