Wix Toolset - обновить и не перезаписывать файл конфигурации - PullRequest
1 голос
/ 11 октября 2019

У меня есть приложение WPF, которое подключается к некоторому веб-сервису по некоторому URL. Я сделал установку, и она работает как чудо, она даже спрашивает об URL-адресе и изменяет файл .config в соответствии с инструкциями. Теперь я хочу обновить приложение, но оставить файл .config без изменений.

Я пробовал некоторые решения в Интернете, он не хочет обновляться, кажется, что каждый раз выполняется только чистая установка.

  <Package InstallerVersion="400" Compressed="yes" InstallScope="perMachine" Platform="x64" />
    <Icon Id="icon.ico" SourceFile="$(var.ProjectDir)Icon.ico" />
    <Property Id="ARPPRODUCTICON" Value="icon.ico" />
    <WixVariable Id="WixUIBannerBmp" Value="Images\installer_top-banner.bmp" />
    <WixVariable Id="WixUIDialogBmp" Value="Images\installer_background.bmp" />
    <WixVariable Id="WixUILicenseRtf" Value="$(var.ProjectDir)\license.rtf" />
    <Property Id="ARPURLINFOABOUT" Value="http://www.Company.com" />
  <Property Id="WIXUI_INSTALLDIR" Value="INSTALLFOLDER" />
    <Property Id="FULLURL" Value="http://demo.Company.com/WcfFullPortal.svc" Secure="yes" />
  <Property Id="AUTH" Value="0" Secure="yes" />
  <Property Id="AUTHVALUE" Value="$(var.httpValue)" Secure="yes" />
  <Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />
  <Upgrade Id="1d96517a-8fc5-4150-b1cb-c3adf479a57d">
    <UpgradeVersion Minimum="1.0.0.0" Maximum="99.0.0.0" Property="PREVIOUSVERSIONSINSTALLED" IncludeMinimum="yes" IncludeMaximum="no" />
  </Upgrade>
  <UIRef Id="SetupDialogUI" />
    <Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT" Value="Launch MyApp" />
    <Property Id="WixShellExecTarget" Value="[#MyApp.UI.WPF.exe]" />
    <CustomAction Id="LaunchApplication" BinaryKey="WixCA" DllEntry="WixShellExec" Impersonate="yes" />
    <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." AllowSameVersionUpgrades="yes" Schedule="afterInstallExecute" />
    <MediaTemplate EmbedCab="yes" />
    <!-- 32-bit / 64-bit variables -->
    <?if $(var.Platform) = x64 ?>
    <?define bitness = "(64 bit)" ?>
    <?define Win64 = "yes" ?>
    <?define PlatformProgramFilesFolder = "ProgramFiles64Folder" ?>
    <?else?>
    <?define bitness = "(32 bit)" ?>
    <?define Win64 = "no" ?>
    <?define PlatformProgramFilesFolder = "ProgramFilesFolder" ?>
    <?endif?>
    <Condition Message="Minimum supported OS is Windows 7."><![CDATA[Installed OR (VersionNT >= 600)]]></Condition>
    <!-- 
<?if $(var.Platform) = x64 ?>
<Condition Message="You need to install the 32-bit version of this product on 32-bit Windows.">
  <![CDATA[VersionNT64]]>
</Condition>
<?endif?>
<?if $(var.Platform) = x86 ?>
<Condition Message="You need to install the 64-bit version of this product on 64-bit Windows.">
  <![CDATA[NOT VersionNT64]]>
</Condition>
<?endif?> -->


</Product>

...

1 Ответ

1 голос
/ 12 октября 2019

Два подхода:

  1. Завершите работу в установщике. MSI не сохраняет (помнят) свойства при последующих инсталляциях. Вы должны собрать значение из файла конфигурации обратно в свойство, чтобы его можно было снова отобразить в пользовательском интерфейсе и повторно применить во время установки.

http://robmensching.com/blog/posts/2010/5/2/the-wix-toolsets-remember-property-pattern/

Переместите сложность из установщика в приложение. Разработайте приложение так, чтобы оно запрашивало настройку при первом запуске. Используйте атрибут файла элемента app.config appSettings, чтобы указать второй файл, содержащий параметр переопределения. Попросите установщика создать app.config, но не второй файл. Попросите приложение сохранить настройки первого запуска во второй файл. Установщик не знает об этом, поэтому он никогда не будет касаться файла во время последующих установок.

https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/appsettings/appsettings-element-for-configuration

Я эксперт по WiX и легко справлюсь с подходом 1,Для новичков в WiX это может быть проблемой. Я обычно придерживаюсь подхода 1, когда это всего лишь несколько настроек, и программа не является интерактивной, как служба Windows или, скажем, веб-приложение, где входные данные являются идентификаторами пула. В противном случае я считаю, что моим клиентам будет проще поддерживать, если я перенесу сложность в код, который они лучше понимают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...