我正在开发一个wix安装程序。此wix安装程序将安装第三方msipackage。
我想让我的wix bootstrapper项目安装这个msipackage,无论用户个人电脑上应该存在哪个版本。这意味着如果存在相同版本(或更新版本),则应覆盖该安装。
我像这样安装我的msipackage:
<MsiPackage Id="InstacalFull" Name="Measurement Computing InstaCal" Vital="yes" Compressed="yes" SourceFile="../Suite.SetupBootstrapper/3rdparty/Instacal/InstaCal.msi">
有没有人对如何实现这个有任何想法?
答案 0 :(得分:0)
使用InstallCondition="1"
每次都会安装
http://wixtoolset.org/documentation/manual/v3/xsd/wix/msipackage.html
InstallCondition
的字符串
安装包之前要评估的条件。只有在条件计算结果为true时才会安装该程序包。如果条件评估为false并且正在安装,修复或修改软件包,则将卸载软件包。
答案 1 :(得分:0)
我知道这个人已经老了,但是因为我遇到了这个问题,也许这对某人也有所帮助。
在我的情况下修复就足够了,所以虽然从技术上说它没有重新安装,但实际上是Repair = Reinstall。 我需要重新安装URLrewrite,因为当IIS Windows功能被禁用时它可能会被破坏。
您需要在自定义BootstrapperApplication类中为PlanPackageBegin添加自定义处理程序,例如:
CustomBootstrapperApplication.Model.Bootstrapper.PlanPackageBegin += this.PlanPackageBegin;
...........
private void PlanPackageBegin(object sender, PlanPackageBeginEventArgs e)
{
if (e.PackageId.ToLower().Contains("urlrewrite"))
{
if (CustomBootstrapperApplication.Model.Command.Action != LaunchAction.Uninstall && e.State == RequestState.Present)
{
CustomBootstrapperApplication.Model.Engine.Log(LogLevel.Verbose, string.Format("{0} is installed, forcing Repair", e.PackageId));
e.State = RequestState.Repair;
}
}
_packageList.Add(e.PackageId, e.State);
}
在Bundle中:
<!-- Note: this Id is used in PlanPackageBegin -->
<MsiPackage Id='urlrewrite2X64' Vital='no'
Permanent='yes'
SourceFile="rewrite_amd64.msi"
DownloadUrl="http://example.com/rewrite_amd64.msi"
DisplayInternalUI="no"
Visible="yes"
InstallCondition="VersionNT64"/>
您可以在升级期间通过PlanPackageBegin中的类似内容强制卸载以前的MSI:
if (LaunchAction.Uninstall == CustomBootstrapperApplication.Model.Command.Action && (CustomBootstrapperApplication.Model.Command.Relation == RelationType.Upgrade))
{
e.State = RequestState.None;
}