Обнаружить присутствие vcredist - используя UpgradeCode

В пакете загрузчика wix burn: как определить, присутствует ли ms vcredist 2013 x86 или нет?
я делаю проверку на Upgrade Id / UpgradeCode данного пакета, но пакет всегда устанавливает его заново, даже если он уже установлен.

...
<Bundle>
    ...
    <Chain>
        <!-- redist packages -->
        <PackageGroupRef Id="redist"/>
        ...
    </Chain>
</Bundle>

<Fragment>
    <PackageGroup Id="redist">
        <PackageGroupRef Id="redist_vc120" />
        ...
    </PackageGroup>
</Fragment>

<Fragment>
    <!-- vcredist 2013 x86 -->
    <?define vcredist2013minversion="12.0.21005"?>
    <Upgrade Id="B59F5BF1-67C8-3802-8E59-2CE551A39FC5">
        <UpgradeVersion Minimum="$(var.vcredist2013minversion)" Property="VCREDIST2013INSTALLED" OnlyDetect="yes" IncludeMinimum="yes" />
    </Upgrade>

    <PackageGroup Id="redist_vc120">
        <ExePackage Id="vc120" Cache="yes" PerMachine="yes" Permanent="yes" Vital="yes" Compressed="yes"
            Name="redist\VC120_Runtime\vcredist_x86.exe"
            InstallCommand="/quiet /norestart"
            InstallCondition="Not VCREDIST2013INSTALLED"
        />
    </PackageGroup>
</Fragment>
...

что-то не так с InstallCondition?
или мне нужно добавить DetectCondition?

в файле журнала это читает:

Detected related package: {13A4EE12-23EA-3371-91EE-EFB36DDFFF3E}, scope: PerMachine, version: 12.0.21005.0, language: 0 operation: MajorUpgrade
Detected package: vc120, state: Absent, cached: None
Condition 'Not VCREDIST2013INSTALLED' evaluates to true.
Planned package: vc120, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: None, cache: Yes, uncache: No, dependency: None
Applying execute package: vc120, action: Install, path: <path and command line>...
Applied execute package: vc120, result: 0x0, restart: None

но также удаляя InstallCondition и заменить его следующим DetectCondition не работал:

<PackageGroup Id="redist_vc120">
    <ExePackage Id="vc120" Cache="yes" PerMachine="yes" Permanent="yes" Vital="yes" Compressed="yes"
        Name="redist\VC120_Runtime\vcredist_x86.exe"
        InstallCommand="/quiet /norestart"
        DetectCondition="VCREDIST2013INSTALLED"
    />
</PackageGroup>

-

редактировать:
просто чтобы объяснить дальше: я пытаюсь подход с UpgradeCode потому что я не хочу проверять конкретный установочный пакет, но для minimum version,

2 ответа

Решение

Следующая логика прекрасно работает для пакета начальной загрузки (прожиг):

<Fragment>
    <!-- vcredist 2013 x86 -->
    <util:ProductSearch Id="VCREDIST_120_x86"
        UpgradeCode="B59F5BF1-67C8-3802-8E59-2CE551A39FC5"
        Result="version"
        Variable="VCREDIST_120_x86" />

    <PackageGroup Id="redist_vc120">
        <ExePackage Id="vc120" Cache="yes" PerMachine="yes" Permanent="yes" Vital="yes" Compressed="yes"
            SourceFile="redist\VC120_Runtime\vcredist_x86.exe"
            InstallCommand="/quiet /norestart"
            DetectCondition="(VCREDIST_120_x86 &gt;= v12.0.21005)" />
    </PackageGroup>
</Fragment>

подвести итоги:

  • для поиска он использует util:ProductSearch с UpgradeCode параметр.
  • для обнаружения он делает сравнение версий в DetectCondition,

При записи обнаружение продукта на основе кода UpgradeCode, очевидно, работает иначе, чем в MSI (где мы можем использовать таблицу обновления вместе с атрибутом "OnlyDetect" и затем настроить "LaunchCondition").


просто для справки:
я нашел следующие UpgradeCodes (вместе с их минимальной версией), чтобы соответствовать...

x86:

vcredist 2005 x86 - 86C9D5AA-F00C-4921-B3F2-C60AF92E2844, 8.0.61001
vcredist 2008 x86 - DE2C306F-A067-38EF-B86C-03DE4B0312F9, 9.0.30729.6161
vcredist 2010 x86 - 1F4F1D2A-D9DA-32CF-9909-48485DA06DD5, 10.0.40219
vcredist 2012 x86 - 4121ED58-4BD9-3E7B-A8B5-9F8BAAE045B7, 11.0.61030
vcredist 2013 x86 - B59F5BF1-67C8-3802-8E59-2CE551A39FC5, 12.0.40660
vcredist 2015 x86 - 65E5BD06-6392-3027-8C26-853107D3CF1A, 14.0.23506
vcredist 2017 x86 - 65E5BD06-6392-3027-8C26-853107D3CF1A, 14.15.26706

x64:

vcredist 2005 x64 - A8D19029-8E5C-4E22-8011-48070F9E796E, 8.0.61000
vcredist 2008 x64 - FDA45DDF-8E17-336F-A3ED-356B7B7C688A, 9.0.30729.6161
vcredist 2010 x64 - 5B75F761-BAC8-33BC-A381-464DDDD813A3, 10.0.40219
vcredist 2012 x64 - EFA6AFA1-738E-3E00-8101-FD03B86B29D1, 11.0.61030
vcredist 2013 x64 - 20400CF0-DE7C-327E-9AE4-F0F38D9085F8, 12.0.40660
vcredist 2015 x64 - 36F68A90-239C-34DF-B58C-64B30153CE35, 14.0.23506
vcredist 2017 x64 - 36F68A90-239C-34DF-B58C-64B30153CE35, 14.15.26706

ИЗМЕНИТЬ ИСТОРИЮ:

1) обновил код UpradeCode для vcredist 2017 x86 согласно комментарию Брайана Сазерленда.
2) добавлены варианты x64, чтобы ответить на вопрос в комментарии Ахмеда Даниэля. обновленный список в основном определяется из запуска модифицированной версии решения, как предложено в ответе /questions/36052552/kak-ya-mogu-najti-kod-obnovleniya-dlya-ustanovlennogo-fajla-msi/36052554#36052554
Обидно, что нет официальной документации от Microsoft по поводу этих конкретных кодов апгрейда, но мы просто должны сами разобраться...

Я использую реестр serach, чтобы проверить, установлен ли он, попробуйте сделать это следующим образом:

<util:RegistrySearch
  Root="HKLM"
  Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\<Place Guid>"
  Value="DisplayVersion"
  Variable="MSVC_2013_x64"
  Win64="yes"/>

и состояние как:

DetectCondition="MSVC_2013_x64 AND (MSVC_2013_x64 &gt;= v12.0.21005)"
Другие вопросы по тегам