From 9b768e8ff1cae5c371f6e93a8b62671d8015387d Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Sat, 19 Jul 2025 00:47:28 +0200 Subject: [PATCH] Better windows installer (#2387) * feat: Add redist to windows installer * feat: Add new windows icon --- pubspec_base.yaml | 10 ++++++++++ scripts/windows/.gitignore | 3 ++- scripts/windows/README.md | 21 +++++++++++++++++++++ scripts/windows/build_exe_installer.iss | 3 ++- windows/runner/resources/app_icon.ico | Bin 17470 -> 17515 bytes 5 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 scripts/windows/README.md diff --git a/pubspec_base.yaml b/pubspec_base.yaml index 928f1b18f..cb35f2d46 100644 --- a/pubspec_base.yaml +++ b/pubspec_base.yaml @@ -150,6 +150,7 @@ dev_dependencies: git: url: https://github.com/cake-tech/google-translator.git version: 1.0.0 + msix: ^3.16.9 dependency_overrides: bech32: @@ -221,3 +222,12 @@ flutter: - asset: assets/fonts/Lato-Medium.ttf - asset: assets/fonts/Lato-Semibold.ttf - asset: assets/fonts/Lato-Bold.ttf + +msix_config: + display_name: Cake Wallet + publisher_display_name: Cake Labs + identity_name: com.cakewallet.wallet + msix_version: 1.0.0.1 + logo_path: assets/images/app_logo.png + trim_logo: false + capabilities: internetClient diff --git a/scripts/windows/.gitignore b/scripts/windows/.gitignore index bb28076cd..83d395f3c 100644 --- a/scripts/windows/.gitignore +++ b/scripts/windows/.gitignore @@ -1 +1,2 @@ -actions-runner \ No newline at end of file +actions-runner +vc_redist.x64.exe diff --git a/scripts/windows/README.md b/scripts/windows/README.md new file mode 100644 index 000000000..d1decf74f --- /dev/null +++ b/scripts/windows/README.md @@ -0,0 +1,21 @@ +# Windows Build Instructions + +## Prerequisites + +Before building the Windows installer, make sure you have the following prerequisites: + +1. Inno Setup installed on your system +2. Microsoft Visual C++ Redistributable for Visual Studio 2022 (x64) installer + +## Downloading the VC++ Redistributable Installer + +The Windows installer requires the Microsoft Visual C++ Redistributable for Visual Studio 2022 (x64) installer. You need to download it from Microsoft's website and place it in the same directory as the Inno Setup script (`build_exe_installer.iss`). + +1. Download the VC++ Redistributable installer from: https://aka.ms/vs/17/release/vc_redist.x64.exe +2. Save the file as `vc_redist.x64.exe` in the `scripts\windows` directory + +## Building the Installer + +Once you have downloaded the VC++ Redistributable installer, you can build the Windows installer by running the Inno Setup script. + +The installer will include the VC++ Redistributable and install it during the Cake Wallet installation process. diff --git a/scripts/windows/build_exe_installer.iss b/scripts/windows/build_exe_installer.iss index 1425b614b..9cde4090e 100644 --- a/scripts/windows/build_exe_installer.iss +++ b/scripts/windows/build_exe_installer.iss @@ -33,6 +33,7 @@ Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{ [Files] Source: "..\..\build\windows\x64\runner\Release\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs +Source: "vc_redist.x64.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall ; NOTE: Don't use "Flags: ignoreversion" on any shared system files [Icons] @@ -40,5 +41,5 @@ Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon [Run] +Filename: "{tmp}\vc_redist.x64.exe"; Parameters: "/install /quiet /norestart"; StatusMsg: "Installing VC++ Redistributable..."; Flags: waituntilterminated Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent - diff --git a/windows/runner/resources/app_icon.ico b/windows/runner/resources/app_icon.ico index 242fb9cb5f35992d02996c591a2bc69a08b5ac94..96713d7574e400c2d477a2046153171a4dba8d00 100644 GIT binary patch literal 17515 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 literal 17470 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