如何从 Electron Builder 参数化 msi 文件

KeK*_*Kru 4 windows-installer electron-builder

我正在尝试使用 electro-builder (版本 20.39.0)创建一个 .msi 安装程序文件,可以在安装时对其进行参数化。参数(例如服务器端点)应写入文件中。

示例:
然后应该出现在安装目录中MsiExec /i "MyProject.msi" SERVER_ENDPOINT=myapp.example.com
myapp.example.com文件中。

我尝试编辑Electron-builder 的 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>

Run Code Online (Sandbox Code Playgroud)

跑步与

MsiExec /i "MyProject.msi" /L*v Install.log SERVER_ENDPOINT=myapp.example.com
Run Code Online (Sandbox Code Playgroud)

我还没有工作。它安装但不显示writeConfigFile在日志文件中。

您认为这是使 msi 文件参数化的正确方法吗?
或者您会推荐另一种解决方案吗?

我还找到了 Orca.exe,用于创建 MST 文件,但我更喜欢一个简单的解决方案,无需手动步骤。

KeK*_*Kru 6

在 Stein \xc3\x85smul 的帮助下,这是我当前的解决方案:

\n\n

我采用了电子构建器当前的 WiX 模板,并添加了一个将变量写入 ini 文件的选项。

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

完整的模板如下所示:

\n\n
<?xml version="1.0" encoding="UTF-8"?>\n<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">\n  <!-- extended Template from https://github.com/electron-userland/electron-builder/blob/7f0ede7182ab6db8efb0cf4bf3cb183be712fb4e/packages/app-builder-lib/templates/msi/template.xml -->\n  <!-- https://blogs.msdn.microsoft.com/gremlininthemachine/2006/12/05/msi-wix-and-unicode/ -->\n  <Product Id="*" Name="${productName}" UpgradeCode="${upgradeCode}" Version="${version}" Language="1033" Codepage="65001" Manufacturer="${manufacturer}">\n    <Package Compressed="yes" InstallerVersion="500"/>\n\n    <Condition Message="Windows 7 and above is required"><![CDATA[Installed OR VersionNT >= 601]]></Condition>\n\n    <!--\n    AllowSameVersionUpgrades:\n      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.\n      When set to yes, WiX sets the msidbUpgradeAttributesVersionMaxInclusive attribute, which tells MSI to treat a product with the same version as a major upgrade.\n\n      So, AllowSameVersionUpgrades="yes" allows to build and test MSI with the same version, and previously installed app will be removed.\n    -->\n    <MajorUpgrade AllowSameVersionUpgrades="yes" DowngradeErrorMessage=\'A newer version of "[ProductName]" is already installed.\'/>\n    <MediaTemplate CompressionLevel="${compressionLevel}" EmbedCab="yes"/>\n\n    <Property Id="ApplicationFolderName" Value="${installationDirectoryWixName}"/>\n    <Property Id="WixAppFolder" Value="WixPerUserFolder"/>\n    <Property Id="MYSERVER" Value="notDefined"/>\n    <Property Id="MYSECONDPROPERTY" Value="notDefined"/>\n\n    {{ if (iconPath) { }}\n    <Icon Id="icon.ico" SourceFile="${iconPath}"/>\n    <Property Id="ARPPRODUCTICON" Value="icon.ico"/>\n    {{ } -}}\n\n    {{ if (isAssisted || isRunAfterFinish) { }}\n    <CustomAction Id="runAfterFinish" FileKey="mainExecutable" ExeCommand="" Execute="immediate" Impersonate="yes" Return="asyncNoWait"/>\n    {{ } -}}\n\n    <Property Id="ALLUSERS" Secure="yes" Value="2"/>\n    {{ if (isPerMachine) { }}\n    <Property Id="MSIINSTALLPERUSER" Secure="yes"/>\n    {{ } else { }}\n    <Property Id="MSIINSTALLPERUSER" Secure="yes" Value="1"/>\n    {{ } -}}\n\n    {{ if (isAssisted) { }}\n    <!-- Check "Run after finish" checkbox by default -->\n    <Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOX" Value="1"/>\n    <Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT" Value="Run ${productName}"/>\n\n    <UIRef Id="WixUI_Assisted"/>\n    {{ } else if (isRunAfterFinish) { }}\n    <!-- https://stackoverflow.com/questions/1871531/launch-after-install-with-no-ui -->\n    <InstallExecuteSequence>\n      <Custom Action="runAfterFinish" After="InstallFinalize"/>\n    </InstallExecuteSequence>\n    {{ } -}}\n\n    <Directory Id="TARGETDIR" Name="SourceDir">\n      <Directory Id="${programFilesId}">\n        <Directory Id="APPLICATIONFOLDER" Name="${installationDirectoryWixName}">\n          <Component Id="AddLineTo_AppConfig.ini" Guid="{4171FB60-FDC5-46CF-A4D8-4AE9CADB4BE9}" KeyPath="yes" Feature="ProductFeature">\n            <IniFile Id="AddLineTo_AppConfig.ini1" Name="AppConfig.ini" Directory="APPLICATIONFOLDER" Section="AppConfig" Key="Server" Value="&quot;[MYSERVER]&quot;" Action="addLine"/>\n            <IniFile Id="AddLineTo_AppConfig.ini2" Name="AppConfig.ini" Directory="APPLICATIONFOLDER" Section="AppConfig" Key="SecondProp" Value="&quot;[MYSECONDPROPERTY]&quot;" Action="addLine"/>\n          </Component>\n        </Directory>\n      </Directory>\n\n      <!-- Desktop link -->\n      {{ if (isCreateDesktopShortcut) { }}\n      <Directory Id="DesktopFolder" Name="Desktop"/>\n      {{ } -}}\n\n      <!-- Start menu link -->\n      {{ if (isCreateStartMenuShortcut) { }}\n      <Directory Id="ProgramMenuFolder"/>\n      {{ } }}\n    </Directory>\n\n    <!-- Files -->\n    <Feature Id="ProductFeature" Absent="disallow">\n      <ComponentGroupRef Id="ProductComponents"/>\n    </Feature>\n\n    {{-dirs}}\n\n    <ComponentGroup Id="ProductComponents" Directory="APPLICATIONFOLDER">\n      {{-files}}      \n    </ComponentGroup>\n  </Product>\n</Wix>\n\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用 Electron-builder@20.39.0,我创建了 MSI

\n\n
set DEBUG=electron-builder:*\ncp template.xml .\\node_modules\\app-builder-lib\\templates\\msi\\template.xml\nelectron-builder\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后安装 MSI

\n\n
MsiExec /i "myapp.msi" MYSERVER=myapp.example.com MYSECONDPROPERTY=helloworld /L*v Install.log\n
Run Code Online (Sandbox Code Playgroud)\n\n

%USERPROFILE%\\AppData\\Local\\Programs\\MyApp\\AppConfig.ini安装完成后,我在 installdir ( )中得到了 AppConfig.ini

\n\n
[AppConfig]\nServer="myapp.example.com"\nSecondProp="helloworld"\n
Run Code Online (Sandbox Code Playgroud)\n

  • 已经有一段时间了,但我认为指南对于使其发挥作用是必要的。否则我认为就有错误了。我还没有考虑花时间在 Github 上创建 PR。我为此主题创建了一个问题,但没有回应并且已关闭。请参阅https://github.com/electron-userland/electron-builder/issues/3784 (2认同)