Как определить установленные в данный момент функции во время MajorUpgrade с помощью пакетов WiX Burn MBA?
Я использую функции Burn / Managed Bootstrapper в WiX 3.7 для создания собственного установщика на основе MBA. Для каждого из пакетов в цепочке моего пакета при выполнении MinorUpdate я легко могу определить, какие функции пакета уже установлены, чтобы обеспечить сохранение этих вариантов выбора во время обновления, используя эти события, предоставленные в базовом классе WiX для загрузчика. :DetectPackageComplete
, DetectMsiFeature
, DetectRelatedBundle
, DetectRelatedMsiPackage
, DetectComplete
.
Тем не мение,во время MajorUpgrade я вижу только способ определить, какие пакеты установлены, но не вижу, как определить, какие компоненты установлены, так как событие DetectMsiFeature не запускается. Я пытался использоватьMigrateFeatures
пометьте конфигурацию продукта, но это, похоже, не работает (или я не правильно его использую).
Как правильно определить / перенести существующие функции при выполнении MajorUpgrade с помощью настраиваемого приложения начальной загрузки в WiX?
Некоторые фрагменты файла:Примечание. Я могу предоставить полностью работающее VS-решение со всем кодом, если это будет полезно.
Bundle.wxs:<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:bal="http://schemas.microsoft.com/wix/BalExtension">
<Bundle Name="Bootstrapper1" Version="1.1.0.0" Manufacturer="Knights Who Say Ni" UpgradeCode="e6fbf160-d1d9-4b38-b293-94d60eae876f" Compressed="yes">
<BootstrapperApplicationRef Id="ManagedBootstrapperApplicationHost" >
<Payload SourceFile="$(var.ManagedBootstrapperApplication.TargetPath)" />
<!-- other files here -->
</BootstrapperApplicationRef>
<Chain>
<PackageGroupRef Id="NetFx40Web" />
<MsiPackage SourceFile="$(var.SetupProject1.TargetPath)" EnableFeatureSelection="yes" Vital="yes" Compressed="yes" />
</Chain>
</Bundle>
</Wix>
Product.wxs:
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*" Name="SetupProject1" Language="1033" Codepage="1252"
Version="1.1.0.0" Manufacturer="Knights Who Say Ni"
UpgradeCode="5fcd463a-3287-4fdf-bf00-d5d74baeccda">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
<MajorUpgrade AllowSameVersionUpgrades="no" AllowDowngrades="no" MigrateFeatures="yes" DowngradeErrorMessage="Bring me a shrubbery!" />
<MediaTemplate EmbedCab="yes" />
<Feature Id="feature_one" Title="Primary Feature" Level="1">
<Component Id="CMP_emptyFile1" Guid="{1740AFA6-A98F-482A-B319-A153AA1BEF10}" Directory="INSTALLFOLDER">
<File Id="file_emptyFile1" Checksum="yes" KeyPath="yes" Source="TextFile1.txt" />
</Component>
</Feature>
<Feature Id="feature_Two" Title="Optional Feature" Level="2">
<Component Id="CMP_emptyFile2" Guid="{F0831C98-AF35-4F5E-BE9A-2F5E3ECF893C}" Directory="INSTALLFOLDER">
<File Id="file_emptyFile2" Checksum="yes" KeyPath="yes" Source="TextFile2.txt" />
</Component>
</Feature>
</Product>
</Wix>
CustomBootstrapper.cs
public class CustomBootstrapperApplication : BootstrapperApplication {
protected override void Run() {
DetectPackageComplete += HandlePackageDetected;
DetectMsiFeature += HandleFeatureDetected;
DetectRelatedBundle += HandleExistingBundleDetected;
DetectRelatedMsiPackage += HandleExistingPackageDetected;
DetectComplete += HandleDetectComplete;
this.Engine.Detect();
//blocks here until DetectComplete fires...
}
private void HandleExistingPackageDetected(object sender, DetectRelatedMsiPackageEventArgs e) {
Log(string.Format("Detected Related Package {2} ({1}) at version {3} which is a {0}",
e.Operation, e.PackageId, e.ProductCode, e.Version));
}
private void HandleExistingBundleDetected(object sender, DetectRelatedBundleEventArgs e) {
Log(string.Format("Detected Related {2} Bundle {0} at version {1} which is a {3}",
e.ProductCode, e.Version, e.RelationType, e.Operation));
}
private void HandleFeatureDetected(object sender, DetectMsiFeatureEventArgs e) {
Log(string.Format("Feature {0} from Package {1} detected in state {2}",
e.FeatureId, e.PackageId, e.State));
}
private void HandlePackageDetected(object sender, DetectPackageCompleteEventArgs e) {
Log(string.Format("Package {0} Detected in State {1}",
e.PackageId, e.State));
}
private void HandleDetectComplete(object sender, DetectCompleteEventArgs e)
{ /* release the main thread to continue with work */ }
}
Выход на апгрейд:
Обратите внимание, что пакет и две функции были установлены на версии 1.0.0 и обнаружены в состоянии «Отсутствует». Связанный пакет был обнаружен, но подробности не включены.
Detected Related Upgrade Bundle {5eff0a3c-4b0d-4fd9-875f-05117c07f373) at version 1.0.0.0 which is a MajorUpgrade Package NetFx4OWeb Detected in State Present Detected Related Package {540AE32D-75C0-4BF3-A72D-ADBE97FSFF3E} (SetupProject1.msi) at version 1.0.0.0 which is a MajorUpgrade Feature feature_one from Package SetupProjectl.msi detected in state Absent Feature feature_Two from Package SetupProjecti .msi detected in state Absent Package SetupProject1.msi Detected in State Absent