民间,
我们的MSI安装遇到了一些排序问题。作为我们应用程序的一部分,我们安装了一系列服务,允许用户选择是立即启动还是稍后启动它们。
当他们立即开始时,他们似乎在安装过程中起得太早 - 在我们的数据库管理员有机会更新数据库之前。
现在,我们运行数据库更新程序的自定义操作如下所示 - 它正在“InstallFinalize”之后运行 - 在此过程中很晚。
<InstallExecuteSequence>
<RemoveExistingProducts After='InstallInitialize' />
<Custom Action='RunDbUpdateManagerAction' After='InstallFinalize'>
DbUpdateManager=3</Custom>
</InstallExecuteSequence>
在任何已安装的服务启动之前确保数据库脚本执行之前或之后运行更合适的步骤是什么?是否有“BeforeServiceStart”步骤?
修改
只是在标签上定义“Before ='StartServices'”属性并没有解决我的问题。
我假设问题是:自定义操作有一个“内部文本”,表示一个条件,这个条件是:“&amp; DbUpdateManager = 3”。从我可以从试验和推论中推断出来的错误,这可能意味着“必须发布DbUpdateManager功能”。
现在,问题是:“PublishFeature”在安装序列的最后,就在“InstallFinalize”之前,并且肯定是在InstallServices / StartServices之后。因此,当我指定“Before = StartServices”要求时,条件“必须发布DbUpdateManager功能”尚不正确,因此DbUpdateManager不会被执行: - (
我尝试删除条件 - 在这种情况下,我的DbUpdateManager有时根本不会执行,有时不止一次 - 没有真正明确的模式,以便.......
还有什么想法?有没有办法可以检查条件“安装了DbUpdateManager功能”,这在“InstallFiles”步骤之后会是真的吗?
马克
答案 0 :(得分:1)
没有BeforeServiceStart
,但您可以尝试Before='StartServices'
。
答案 1 :(得分:1)
好吧,看来marc_s在另一个question得到了回答。但是,由于我的解决方案略有不同,另一个问题需要进行一些重构以获得解决方案,这正是对我有用的:
...
<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>