Как параметризовать MSI-файл из электронного компоновщика - PullRequest
1 голос
/ 01 апреля 2019

Я пытаюсь создать установочный файл .msi с помощью электронного компоновщика (версия 20.39.0), который можно параметрировать во время установки. Параметры (например, конечная точка сервера) должны быть записаны в файл.

Пример:
когда MsiExec /i "MyProject.msi" SERVER_ENDPOINT=myapp.example.com
тогда myapp.example.com должен появиться в файле в установочном каталоге.

Я попытался отредактировать файл шаблона wix для электронного конструктора , добавив следующее для записи $ {SERVER_ENDPOINT} в server.txt

Файл C:\...\MyProject\node_modules\electron-builder-lib\templates\msi\template.xml

...
<CustomAction Id="writeConfigFile" Directory="APPLICATIONFOLDER" Execute="commit" Impersonate="yes" ExeCommand="cmd.exe /c &quot;echo ${SERVER_ENDPOINT} > server.txt&quot;" Return="check" />
...
<InstallExecuteSequence>
  ...
  <Custom Action="writeConfigFile" After="InstallFinalize"/>
</InstallExecuteSequence>

Бег с

MsiExec /i "MyProject.msi" /L*v Install.log SERVER_ENDPOINT=myapp.example.com

У меня еще не работает. Он устанавливает, но не показывает writeConfigFile в файле журнала.

Как вы думаете, это правильный подход для параметризации файла msi?
Или вы бы порекомендовали другое решение?

Я также нашел Orca.exe для создания MST-файла, но я бы предпочел простое решение без ручных действий.

Ответы [ 2 ]

3 голосов
/ 02 апреля 2019

Настройка свойств MSI

Я не знаком с программой Electron Builder.Однако в терминах MSI необходимо указать, что содержимое файла должно быть заменено на Свойство MSI , а затем вам необходимо установить свойство либо в transform,на command line или в property table (встроенный в MSI).

Фактически вы можете установить все три сразу, и я не уверен, какиеможно было бы применить :-).Конечно, командная строка переопределяет таблицу свойств, но я не уверен, что победит в битве между преобразованием и параметром командной строки:

Преобразование (применение преобразования ккомандная строка, фактические настройки внутри файла преобразования - mst):

msiexec.exe /i "MySetup.msi" TRANSFORMS="MyTransform.mst"

Командная строка (настройка свойств PUBLIC вкомандная строка):

msiexec.exe /i "MySetup.msi" MYPROPERTY="My Value here"

Таблица свойств (встроенная таблица свойств в каждом MSI также может иметь значение):

Property Table


Использование свойств MSI

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

  • Если файл является INI file, установить параметр довольно просто, поскольку это встроенная функция MSI.
  • XML file updates и text file updates хуже, потому что тогда вы полагаетесь на сторонние решения или делаете это самостоятельно с помощью пользовательских действий ( Я бы не стал делать последнее ).

Advanced Installer имеет очень хорошие функции для замены параметров в XML и текстовых файлах. Installshield также имеет такие функции.Открытый исходный код Инструментарий WiX также имеет функции для поддержки обновлений файлов XML , но он намного сложнее коммерческих инструментов.

СС уважением к Электрону, я не знаю, как это работает.Но в любом случае центральная задача состоит в том, чтобы MSI содержал такую ​​конструкцию, как эта:

Advanced Installer

Это от MSI, скомпилированного с AdvancedУстановщик.Вы видите, что у меня есть параметризованное значение [MYVALUE].Его можно установить в командной строке, поскольку это свойство ALL UPPERCASE, также известное как свойство PUBLIC MSI.Во время установки свойство в фигурных скобках будет заменено значением, переданным в. Очевидно.


Некоторые ссылки :

0 голосов
/ 05 апреля 2019

С помощью Stein Åsmul это мое текущее решение:

Я взял текущий WiX-шаблон электронного компоновщика и добавил опцию записи переменных в INI-файл.

<Property Id="MYSERVER" Value="notDefined"/>
<Property Id="MYSECONDPROPERTY" Value="notDefined"/>
...
<Directory Id="APPLICATIONFOLDER" Name="${installationDirectoryWixName}">
  <Component Id="AddLineTo_AppConfig.ini" Guid="{4171FB60-FDC5-46CF-A4D8-4AE9CADB4BE9}" KeyPath="yes" Feature="ProductFeature">
    <IniFile Id="AddLineTo_AppConfig.ini1" Name="AppConfig.ini" Directory="APPLICATIONFOLDER" Section="AppConfig" Key="Server" Value="&quot;[MYSERVER]&quot;" Action="addLine"/>
    <IniFile Id="AddLineTo_AppConfig.ini2" Name="AppConfig.ini" Directory="APPLICATIONFOLDER" Section="AppConfig" Key="SecondProp" Value="&quot;[MYSECONDPROPERTY]&quot;" Action="addLine"/>
  </Component>
</Directory>

Полный шаблон выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
  <!-- extended Template from https://github.com/electron-userland/electron-builder/blob/7f0ede7182ab6db8efb0cf4bf3cb183be712fb4e/packages/app-builder-lib/templates/msi/template.xml -->
  <!-- https://blogs.msdn.microsoft.com/gremlininthemachine/2006/12/05/msi-wix-and-unicode/ -->
  <Product Id="*" Name="${productName}" UpgradeCode="${upgradeCode}" Version="${version}" Language="1033" Codepage="65001" Manufacturer="${manufacturer}">
    <Package Compressed="yes" InstallerVersion="500"/>

    <Condition Message="Windows 7 and above is required"><![CDATA[Installed OR VersionNT >= 601]]></Condition>

    <!--
    AllowSameVersionUpgrades:
      When set to no (the default), installing a product with the same version and upgrade code (but different product code) is allowed and treated by MSI as two products.
      When set to yes, WiX sets the msidbUpgradeAttributesVersionMaxInclusive attribute, which tells MSI to treat a product with the same version as a major upgrade.

      So, AllowSameVersionUpgrades="yes" allows to build and test MSI with the same version, and previously installed app will be removed.
    -->
    <MajorUpgrade AllowSameVersionUpgrades="yes" DowngradeErrorMessage='A newer version of "[ProductName]" is already installed.'/>
    <MediaTemplate CompressionLevel="${compressionLevel}" EmbedCab="yes"/>

    <Property Id="ApplicationFolderName" Value="${installationDirectoryWixName}"/>
    <Property Id="WixAppFolder" Value="WixPerUserFolder"/>
    <Property Id="MYSERVER" Value="notDefined"/>
    <Property Id="MYSECONDPROPERTY" Value="notDefined"/>

    {{ if (iconPath) { }}
    <Icon Id="icon.ico" SourceFile="${iconPath}"/>
    <Property Id="ARPPRODUCTICON" Value="icon.ico"/>
    {{ } -}}

    {{ if (isAssisted || isRunAfterFinish) { }}
    <CustomAction Id="runAfterFinish" FileKey="mainExecutable" ExeCommand="" Execute="immediate" Impersonate="yes" Return="asyncNoWait"/>
    {{ } -}}

    <Property Id="ALLUSERS" Secure="yes" Value="2"/>
    {{ if (isPerMachine) { }}
    <Property Id="MSIINSTALLPERUSER" Secure="yes"/>
    {{ } else { }}
    <Property Id="MSIINSTALLPERUSER" Secure="yes" Value="1"/>
    {{ } -}}

    {{ if (isAssisted) { }}
    <!-- Check "Run after finish" checkbox by default -->
    <Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOX" Value="1"/>
    <Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT" Value="Run ${productName}"/>

    <UIRef Id="WixUI_Assisted"/>
    {{ } else if (isRunAfterFinish) { }}
    <!-- https://stackoverflow.com/questions/1871531/launch-after-install-with-no-ui -->
    <InstallExecuteSequence>
      <Custom Action="runAfterFinish" After="InstallFinalize"/>
    </InstallExecuteSequence>
    {{ } -}}

    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="${programFilesId}">
        <Directory Id="APPLICATIONFOLDER" Name="${installationDirectoryWixName}">
          <Component Id="AddLineTo_AppConfig.ini" Guid="{4171FB60-FDC5-46CF-A4D8-4AE9CADB4BE9}" KeyPath="yes" Feature="ProductFeature">
            <IniFile Id="AddLineTo_AppConfig.ini1" Name="AppConfig.ini" Directory="APPLICATIONFOLDER" Section="AppConfig" Key="Server" Value="&quot;[MYSERVER]&quot;" Action="addLine"/>
            <IniFile Id="AddLineTo_AppConfig.ini2" Name="AppConfig.ini" Directory="APPLICATIONFOLDER" Section="AppConfig" Key="SecondProp" Value="&quot;[MYSECONDPROPERTY]&quot;" Action="addLine"/>
          </Component>
        </Directory>
      </Directory>

      <!-- Desktop link -->
      {{ if (isCreateDesktopShortcut) { }}
      <Directory Id="DesktopFolder" Name="Desktop"/>
      {{ } -}}

      <!-- Start menu link -->
      {{ if (isCreateStartMenuShortcut) { }}
      <Directory Id="ProgramMenuFolder"/>
      {{ } }}
    </Directory>

    <!-- Files -->
    <Feature Id="ProductFeature" Absent="disallow">
      <ComponentGroupRef Id="ProductComponents"/>
    </Feature>

    {{-dirs}}

    <ComponentGroup Id="ProductComponents" Directory="APPLICATIONFOLDER">
      {{-files}}      
    </ComponentGroup>
  </Product>
</Wix>

С помощью electronic-builder@20.39.0 я создаю MSI с

set DEBUG=electron-builder:*
cp template.xml .\node_modules\app-builder-lib\templates\msi\template.xml
electron-builder

А затем установите MSI с

MsiExec /i "myapp.msi" MYSERVER=myapp.example.com MYSECONDPROPERTY=helloworld /L*v Install.log

После завершения установки я получил AppConfig.ini в моем каталоге установки (%USERPROFILE%\AppData\Local\Programs\MyApp\AppConfig.ini)

[AppConfig]
Server="myapp.example.com"
SecondProp="helloworld"
...