From a8f62757639a4e67b9ce411241409fae64bd4f7c Mon Sep 17 00:00:00 2001 From: Juan Cruz Viotti Date: Thu, 15 Jun 2017 12:10:22 -0400 Subject: [PATCH] chore: generate single-binary portable installers on Windows (#1518) We currently support portable builds that are basically ZIPs containing the main Etcher executable and all its related libraries. Turns out `electron-builder` supports NSIS-based portable builds that can create a single executable that has everything it needs to run, including any external assets. This commit makes use of this new portable Windows installer functionality, replacing the old ZIP approach. Change-Type: patch Changelog-Entry: Generate single-binary portable installers on Windows. Signed-off-by: Juan Cruz Viotti --- Makefile | 50 ++------ package.json | 4 + .../build/electron-configure-package-win32.sh | 114 ------------------ 3 files changed, 15 insertions(+), 153 deletions(-) delete mode 100755 scripts/build/electron-configure-package-win32.sh diff --git a/Makefile b/Makefile index 506bdbd0..a56959a5 100644 --- a/Makefile +++ b/Makefile @@ -337,27 +337,6 @@ ifeq ($(TARGET_PLATFORM),linux) -o $@ endif -ifeq ($(TARGET_PLATFORM),win32) - ./scripts/build/electron-configure-package-win32.sh -p $(word 2,$^) -a $< \ - -n "$(APPLICATION_NAME)" \ - -d "$(APPLICATION_DESCRIPTION)" \ - -v "$(APPLICATION_VERSION)" \ - -l LICENSE \ - -c "$(APPLICATION_COPYRIGHT)" \ - -m "$(COMPANY_NAME)" \ - -i assets/icon.ico \ - -w $(BUILD_TEMPORARY_DIRECTORY) \ - -o $@ -ifdef CODE_SIGN_CERTIFICATE -ifdef CODE_SIGN_CERTIFICATE_PASSWORD - ./scripts/build/electron-sign-exe-win32.sh -f $@/$(APPLICATION_NAME).exe \ - -d "$(APPLICATION_NAME) - $(APPLICATION_VERSION)" \ - -c $(CODE_SIGN_CERTIFICATE) \ - -p $(CODE_SIGN_CERTIFICATE_PASSWORD) -endif -endif -endif - assets/osx/installer.tiff: assets/osx/installer.png assets/osx/installer@2x.png tiffutil -cathidpicheck $^ -out $@ @@ -407,25 +386,18 @@ $(BUILD_OUTPUT_DIRECTORY)/$(APPLICATION_NAME_LOWERCASE)-electron_$(APPLICATION_V ./scripts/build/electron-installer-redhat-linux.sh -p $< -r "$(TARGET_ARCH)" -o $| \ -c scripts/build/redhat/config.json -$(BUILD_OUTPUT_DIRECTORY)/$(APPLICATION_NAME)-$(APPLICATION_VERSION)-win32-$(TARGET_ARCH).zip: \ - $(BUILD_DIRECTORY)/$(APPLICATION_NAME)-$(APPLICATION_VERSION)-win32-$(TARGET_ARCH) \ +$(BUILD_OUTPUT_DIRECTORY)/$(APPLICATION_NAME)-$(APPLICATION_VERSION)-win32-$(TARGET_ARCH)-portable.exe: \ | $(BUILD_OUTPUT_DIRECTORY) - ./scripts/build/zip-file.sh -f $< -s $(TARGET_PLATFORM) -o $@ + CSC_LINK=$(CODE_SIGN_CERTIFICATE) CSC_KEY_PASSWORD=$(CODE_SIGN_CERTIFICATE_PASSWORD) TARGET_ARCH=$(TARGET_ARCH) \ + $(NPX) build --win portable $(ELECTRON_BUILDER_OPTIONS) + mv $(BUILD_DIRECTORY)/$(notdir $@) $@ $(BUILD_OUTPUT_DIRECTORY)/$(APPLICATION_NAME)-$(APPLICATION_VERSION)-win32-$(TARGET_ARCH).exe: \ | $(BUILD_OUTPUT_DIRECTORY) - TARGET_ARCH=$(TARGET_ARCH) $(NPX) build --win nsis $(ELECTRON_BUILDER_OPTIONS) + CSC_LINK=$(CODE_SIGN_CERTIFICATE) CSC_KEY_PASSWORD=$(CODE_SIGN_CERTIFICATE_PASSWORD) TARGET_ARCH=$(TARGET_ARCH) \ + $(NPX) build --win nsis $(ELECTRON_BUILDER_OPTIONS) mv $(BUILD_DIRECTORY)/$(notdir $@) $@ -ifdef CODE_SIGN_CERTIFICATE -ifdef CODE_SIGN_CERTIFICATE_PASSWORD - ./scripts/build/electron-sign-exe-win32.sh -f $@ \ - -d "$(APPLICATION_NAME) - $(APPLICATION_VERSION)" \ - -c $(CODE_SIGN_CERTIFICATE) \ - -p $(CODE_SIGN_CERTIFICATE_PASSWORD) -endif -endif - $(BUILD_OUTPUT_DIRECTORY)/$(APPLICATION_NAME)-cli-$(APPLICATION_VERSION)-$(TARGET_PLATFORM)-$(TARGET_ARCH).zip: \ $(BUILD_DIRECTORY)/$(APPLICATION_NAME)-cli-$(APPLICATION_VERSION)-$(TARGET_PLATFORM)-$(TARGET_ARCH) \ | $(BUILD_OUTPUT_DIRECTORY) @@ -498,16 +470,16 @@ PUBLISH_BINTRAY_REDHAT += \ endif ifeq ($(TARGET_PLATFORM),win32) -electron-installer-zip: $(BUILD_OUTPUT_DIRECTORY)/$(APPLICATION_NAME)-$(APPLICATION_VERSION)-$(TARGET_PLATFORM)-$(TARGET_ARCH).zip -electron-installer-nsis: $(BUILD_OUTPUT_DIRECTORY)/$(APPLICATION_NAME)-$(APPLICATION_VERSION)-win32-$(TARGET_ARCH).exe +electron-installer-portable: $(BUILD_OUTPUT_DIRECTORY)/$(APPLICATION_NAME)-$(APPLICATION_VERSION)-$(TARGET_PLATFORM)-$(TARGET_ARCH)-portable.exe +electron-installer-nsis: $(BUILD_OUTPUT_DIRECTORY)/$(APPLICATION_NAME)-$(APPLICATION_VERSION)-$(TARGET_PLATFORM)-$(TARGET_ARCH).exe cli-installer-zip: $(BUILD_OUTPUT_DIRECTORY)/$(APPLICATION_NAME)-cli-$(APPLICATION_VERSION)-$(TARGET_PLATFORM)-$(TARGET_ARCH).zip TARGETS += \ - electron-installer-zip \ + electron-installer-portable \ electron-installer-nsis \ cli-installer-zip PUBLISH_AWS_S3 += \ - $(BUILD_OUTPUT_DIRECTORY)/$(APPLICATION_NAME)-$(APPLICATION_VERSION)-$(TARGET_PLATFORM)-$(TARGET_ARCH).zip \ - $(BUILD_OUTPUT_DIRECTORY)/$(APPLICATION_NAME)-$(APPLICATION_VERSION)-win32-$(TARGET_ARCH).exe \ + $(BUILD_OUTPUT_DIRECTORY)/$(APPLICATION_NAME)-$(APPLICATION_VERSION)-$(TARGET_PLATFORM)-$(TARGET_ARCH)-portable.exe \ + $(BUILD_OUTPUT_DIRECTORY)/$(APPLICATION_NAME)-$(APPLICATION_VERSION)-$(TARGET_PLATFORM)-$(TARGET_ARCH).exe \ $(BUILD_OUTPUT_DIRECTORY)/$(APPLICATION_NAME)-cli-$(APPLICATION_VERSION)-$(TARGET_PLATFORM)-$(TARGET_ARCH).zip endif diff --git a/package.json b/package.json index 3771e1cc..59cdafa5 100644 --- a/package.json +++ b/package.json @@ -72,6 +72,10 @@ "deleteAppDataOnUninstall": true, "license": "LICENSE", "artifactName": "${productName}-${version}-win32-${env.TARGET_ARCH}.${ext}" + }, + "portable": { + "artifactName": "${productName}-${version}-win32-${env.TARGET_ARCH}-portable.${ext}", + "requestExecutionLevel": "user" } }, "scripts": { diff --git a/scripts/build/electron-configure-package-win32.sh b/scripts/build/electron-configure-package-win32.sh deleted file mode 100755 index 954e7b18..00000000 --- a/scripts/build/electron-configure-package-win32.sh +++ /dev/null @@ -1,114 +0,0 @@ -#!/bin/bash - -### -# Copyright 2016 resin.io -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -### - -set -u -set -e - -OS=$(uname -o 2>/dev/null || true) -if [[ "$OS" != "Msys" ]]; then - echo "This script is only meant to be run in Windows" 1>&2 - exit 1 -fi - -./scripts/build/check-dependency.sh unzip - -function usage() { - echo "Usage: $0" - echo "" - echo "Options" - echo "" - echo " -p " - echo " -n " - echo " -d " - echo " -v " - echo " -c " - echo " -l " - echo " -m " - echo " -a " - echo " -i " - echo " -w " - echo " -o " - exit 1 -} - -ARGV_ELECTRON_PACKAGE="" -ARGV_APPLICATION_NAME="" -ARGV_APPLICATION_DESCRIPTION="" -ARGV_VERSION="" -ARGV_COPYRIGHT="" -ARGV_LICENSE="" -ARGV_COMPANY_NAME="" -ARGV_ASAR="" -ARGV_ICON="" -ARGV_DOWNLOAD_DIRECTORY="" -ARGV_OUTPUT="" - -while getopts ":p:n:d:v:c:l:m:a:i:w:o:" option; do - case $option in - p) ARGV_ELECTRON_PACKAGE="$OPTARG" ;; - n) ARGV_APPLICATION_NAME="$OPTARG" ;; - d) ARGV_APPLICATION_DESCRIPTION="$OPTARG" ;; - v) ARGV_VERSION="$OPTARG" ;; - c) ARGV_COPYRIGHT="$OPTARG" ;; - l) ARGV_LICENSE="$OPTARG" ;; - m) ARGV_COMPANY_NAME="$OPTARG" ;; - a) ARGV_ASAR="$OPTARG" ;; - i) ARGV_ICON="$OPTARG" ;; - w) ARGV_DOWNLOAD_DIRECTORY="$OPTARG" ;; - o) ARGV_OUTPUT="$OPTARG" ;; - *) usage ;; - esac -done - -if [ -z "$ARGV_ELECTRON_PACKAGE" ] \ - || [ -z "$ARGV_APPLICATION_NAME" ] \ - || [ -z "$ARGV_APPLICATION_DESCRIPTION" ] \ - || [ -z "$ARGV_VERSION" ] \ - || [ -z "$ARGV_COPYRIGHT" ] \ - || [ -z "$ARGV_LICENSE" ] \ - || [ -z "$ARGV_COMPANY_NAME" ] \ - || [ -z "$ARGV_ASAR" ] \ - || [ -z "$ARGV_ICON" ] \ - || [ -z "$ARGV_DOWNLOAD_DIRECTORY" ] \ - || [ -z "$ARGV_OUTPUT" ] -then - usage -fi - -unzip "$ARGV_ELECTRON_PACKAGE" -d "$ARGV_OUTPUT" - -mv "$ARGV_OUTPUT/electron.exe" "$ARGV_OUTPUT/$ARGV_APPLICATION_NAME.exe" -cp "$ARGV_LICENSE" "$ARGV_OUTPUT/LICENSE" -echo "$ARGV_VERSION" > "$ARGV_OUTPUT/version" -rm -f "$ARGV_OUTPUT/resources/default_app.asar" - -./scripts/build/electron-brand-exe.sh \ - -f "$ARGV_OUTPUT/$ARGV_APPLICATION_NAME.exe" \ - -n "$ARGV_APPLICATION_NAME" \ - -d "$ARGV_APPLICATION_DESCRIPTION" \ - -v "$ARGV_VERSION" \ - -c "$ARGV_COPYRIGHT" \ - -m "$ARGV_COMPANY_NAME" \ - -i "$ARGV_ICON" \ - -w "$ARGV_DOWNLOAD_DIRECTORY" - -cp "$ARGV_ASAR" "$ARGV_OUTPUT/resources/app.asar" - -if [ -d "$ARGV_ASAR.unpacked" ]; then - cp -rf "$ARGV_ASAR.unpacked" "$ARGV_OUTPUT/resources/app.asar.unpacked" -fi