2016-03-08 15 views
1

в пакете boot bootprapper wix: как определить, присутствует ли ms vcredist 2013 x86 или нет?
Я делаю чек на Upgrade Id/UpgradeCode этого конкретного пакета, но комплект всегда устанавливает его заново, даже если он уже установлен.обнаруживает наличие vcredist 2013 x86 - с помощью 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.

ответ

3

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

<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 (наряду с их минимальной версии), чтобы соответствовать ...

vcredist 2005 x86 - 86C9D5AA-F00C-4921-B3F2-C60AF92E2844, 8.0.61001 
vcredist 2008 x86 - DE2C306F-A067-38EF-B86C-03DE4B0312F9, 9.0.30729 
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.21005 
vcredist 2015 x86 - 65E5BD06-6392-3027-8C26-853107D3CF1A, 14.0.23506 
vcredist 2017 x86 - C78B8E51-0C65-377E-85D1-282F689FE505, 14.10.25008 
+0

Где вы получили эти коды обновления? Я хочу получить коды обновления для x64 и не знаю, где искать.Благодаря –

+1

Вышеуказанные коды не совпадают, что я нашел 'VCRedist 2015/2017 x86 - C146EF48-4D31-3C3D-A2C5-1E91AF8A0A9B' ' VCRedist 2015/2017 x64 - F899BAD3-98ED-308E-A905-56B5338963FF' vcredist - это пакет, имеет основную установку и расширенную установку msi, задаваясь вопросом, действительно ли над id являются дочерними установками? Использование кодов, обозначенных в 2015 году, в тех же кодах, также разработанных для 2017 года https://gist.github.com/nathancorvussolis/6852ba282647aeb0c5c00e742e28eb48 –

0

Я использую 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)" 
+0

проверяет этот ответ на 'ProductCode' из переделка пакет. следовательно, он не сможет обнаружить более позднюю версию пакета обновления пакета redist. в исходном вопросе спросите, как использовать для 'UpgradeCode'. – Opmet

+0

Зачем нужен код обновления? –