184 lines
7.2 KiB
YAML
184 lines
7.2 KiB
YAML
version: '3'
|
|
|
|
includes:
|
|
common: ../Taskfile.yml
|
|
|
|
vars:
|
|
# Signing configuration - edit these values for your project
|
|
# SIGN_CERTIFICATE: "path/to/certificate.pfx"
|
|
# SIGN_THUMBPRINT: "certificate-thumbprint" # Alternative to SIGN_CERTIFICATE
|
|
# TIMESTAMP_SERVER: "http://timestamp.digicert.com"
|
|
#
|
|
# Password is stored securely in system keychain. Run: wails3 setup signing
|
|
|
|
# Docker image for cross-compilation with CGO (used when CGO_ENABLED=1 on non-Windows)
|
|
CROSS_IMAGE: wails-cross
|
|
|
|
tasks:
|
|
build:
|
|
summary: Builds the application for Windows
|
|
cmds:
|
|
# Auto-detect CGO: if CGO_ENABLED=1, use Docker; otherwise use native Go cross-compile
|
|
- task: '{{if and (ne OS "windows") (eq .CGO_ENABLED "1")}}build:docker{{else}}build:native{{end}}'
|
|
vars:
|
|
ARCH: '{{.ARCH}}'
|
|
DEV: '{{.DEV}}'
|
|
vars:
|
|
# Default to CGO_ENABLED=0 if not explicitly set
|
|
CGO_ENABLED: '{{.CGO_ENABLED | default "0"}}'
|
|
|
|
build:native:
|
|
summary: Builds the application using native Go cross-compilation
|
|
internal: true
|
|
deps:
|
|
- task: common:go:mod:tidy
|
|
- task: common:build:frontend
|
|
vars:
|
|
BUILD_FLAGS:
|
|
ref: .BUILD_FLAGS
|
|
DEV:
|
|
ref: .DEV
|
|
- task: common:generate:icons
|
|
cmds:
|
|
- task: generate:syso
|
|
- go build {{.BUILD_FLAGS}} -o "{{.BIN_DIR}}/{{.APP_NAME}}.exe"
|
|
- cmd: powershell Remove-item *.syso
|
|
platforms: [windows]
|
|
- cmd: rm -f *.syso
|
|
platforms: [linux, darwin]
|
|
vars:
|
|
BUILD_FLAGS: '{{if eq .DEV "true"}}-buildvcs=false -gcflags=all="-l"{{else}}-tags production -trimpath -buildvcs=false -ldflags="-w -s -H windowsgui"{{end}}'
|
|
env:
|
|
GOOS: windows
|
|
CGO_ENABLED: '{{.CGO_ENABLED | default "0"}}'
|
|
GOARCH: '{{.ARCH | default ARCH}}'
|
|
|
|
build:docker:
|
|
summary: Cross-compiles for Windows using Docker with Zig (for CGO builds on non-Windows)
|
|
internal: true
|
|
deps:
|
|
- task: common:build:frontend
|
|
- task: common:generate:icons
|
|
preconditions:
|
|
- sh: docker info > /dev/null 2>&1
|
|
msg: "Docker is required for CGO cross-compilation. Please install Docker."
|
|
- sh: docker image inspect {{.CROSS_IMAGE}} > /dev/null 2>&1
|
|
msg: |
|
|
Docker image '{{.CROSS_IMAGE}}' not found.
|
|
Build it first: wails3 task setup:docker
|
|
cmds:
|
|
- task: generate:syso
|
|
- docker run --rm -v "{{.ROOT_DIR}}:/app" {{.GO_CACHE_MOUNT}} {{.REPLACE_MOUNTS}} -e APP_NAME="{{.APP_NAME}}" {{.CROSS_IMAGE}} windows {{.DOCKER_ARCH}}
|
|
- docker run --rm -v "{{.ROOT_DIR}}:/app" alpine chown -R $(id -u):$(id -g) /app/bin
|
|
- rm -f *.syso
|
|
vars:
|
|
DOCKER_ARCH: '{{.ARCH | default "amd64"}}'
|
|
# Mount Go module cache for faster builds
|
|
GO_CACHE_MOUNT:
|
|
sh: 'echo "-v ${GOPATH:-$HOME/go}/pkg/mod:/go/pkg/mod"'
|
|
# Extract replace directives from go.mod and create -v mounts for each
|
|
REPLACE_MOUNTS:
|
|
sh: |
|
|
grep -E '^replace .* => ' go.mod 2>/dev/null | while read -r line; do
|
|
path=$(echo "$line" | sed -E 's/^replace .* => //' | tr -d '\r')
|
|
# Convert relative paths to absolute
|
|
if [ "${path#/}" = "$path" ]; then
|
|
path="$(cd "$(dirname "$path")" 2>/dev/null && pwd)/$(basename "$path")"
|
|
fi
|
|
# Only mount if directory exists
|
|
if [ -d "$path" ]; then
|
|
echo "-v $path:$path:ro"
|
|
fi
|
|
done | tr '\n' ' '
|
|
|
|
package:
|
|
summary: Packages the application
|
|
cmds:
|
|
- task: '{{if eq (.FORMAT | default "nsis") "msix"}}create:msix:package{{else}}create:nsis:installer{{end}}'
|
|
vars:
|
|
FORMAT: '{{.FORMAT | default "nsis"}}'
|
|
|
|
generate:syso:
|
|
summary: Generates Windows `.syso` file
|
|
dir: build
|
|
cmds:
|
|
- wails3 generate syso -arch {{.ARCH}} -icon windows/icon.ico -manifest windows/wails.exe.manifest -info windows/info.json -out ../wails_windows_{{.ARCH}}.syso
|
|
vars:
|
|
ARCH: '{{.ARCH | default ARCH}}'
|
|
|
|
create:nsis:installer:
|
|
summary: Creates an NSIS installer
|
|
dir: build/windows/nsis
|
|
deps:
|
|
- task: build
|
|
cmds:
|
|
# Create the Microsoft WebView2 bootstrapper if it doesn't exist
|
|
- wails3 generate webview2bootstrapper -dir "{{.ROOT_DIR}}/build/windows/nsis"
|
|
- |
|
|
{{if eq OS "windows"}}
|
|
makensis -DARG_WAILS_{{.ARG_FLAG}}_BINARY="{{.ROOT_DIR}}\{{.BIN_DIR}}\{{.APP_NAME}}.exe" project.nsi
|
|
{{else}}
|
|
makensis -DARG_WAILS_{{.ARG_FLAG}}_BINARY="{{.ROOT_DIR}}/{{.BIN_DIR}}/{{.APP_NAME}}.exe" project.nsi
|
|
{{end}}
|
|
vars:
|
|
ARCH: '{{.ARCH | default ARCH}}'
|
|
ARG_FLAG: '{{if eq .ARCH "amd64"}}AMD64{{else}}ARM64{{end}}'
|
|
|
|
create:msix:package:
|
|
summary: Creates an MSIX package
|
|
deps:
|
|
- task: build
|
|
cmds:
|
|
- |-
|
|
wails3 tool msix \
|
|
--config "{{.ROOT_DIR}}/wails.json" \
|
|
--name "{{.APP_NAME}}" \
|
|
--executable "{{.ROOT_DIR}}/{{.BIN_DIR}}/{{.APP_NAME}}.exe" \
|
|
--arch "{{.ARCH}}" \
|
|
--out "{{.ROOT_DIR}}/{{.BIN_DIR}}/{{.APP_NAME}}-{{.ARCH}}.msix" \
|
|
{{if .CERT_PATH}}--cert "{{.CERT_PATH}}"{{end}} \
|
|
{{if .PUBLISHER}}--publisher "{{.PUBLISHER}}"{{end}} \
|
|
{{if .USE_MSIX_TOOL}}--use-msix-tool{{else}}--use-makeappx{{end}}
|
|
vars:
|
|
ARCH: '{{.ARCH | default ARCH}}'
|
|
CERT_PATH: '{{.CERT_PATH | default ""}}'
|
|
PUBLISHER: '{{.PUBLISHER | default ""}}'
|
|
USE_MSIX_TOOL: '{{.USE_MSIX_TOOL | default "false"}}'
|
|
|
|
install:msix:tools:
|
|
summary: Installs tools required for MSIX packaging
|
|
cmds:
|
|
- wails3 tool msix-install-tools
|
|
|
|
run:
|
|
cmds:
|
|
- '{{.BIN_DIR}}/{{.APP_NAME}}.exe'
|
|
|
|
sign:
|
|
summary: Signs the Windows executable
|
|
desc: |
|
|
Signs the .exe with an Authenticode certificate.
|
|
Configure SIGN_CERTIFICATE or SIGN_THUMBPRINT in the vars section at the top of this file.
|
|
Password is retrieved from system keychain (run: wails3 setup signing)
|
|
deps:
|
|
- task: build
|
|
cmds:
|
|
- wails3 tool sign --input "{{.BIN_DIR}}/{{.APP_NAME}}.exe" {{if .SIGN_CERTIFICATE}}--certificate {{.SIGN_CERTIFICATE}}{{end}} {{if .SIGN_THUMBPRINT}}--thumbprint {{.SIGN_THUMBPRINT}}{{end}} {{if .TIMESTAMP_SERVER}}--timestamp {{.TIMESTAMP_SERVER}}{{end}}
|
|
preconditions:
|
|
- sh: '[ -n "{{.SIGN_CERTIFICATE}}" ] || [ -n "{{.SIGN_THUMBPRINT}}" ]'
|
|
msg: "Either SIGN_CERTIFICATE or SIGN_THUMBPRINT is required. Set it in the vars section at the top of build/windows/Taskfile.yml"
|
|
|
|
sign:installer:
|
|
summary: Signs the NSIS installer
|
|
desc: |
|
|
Creates and signs the NSIS installer.
|
|
Configure SIGN_CERTIFICATE or SIGN_THUMBPRINT in the vars section at the top of this file.
|
|
Password is retrieved from system keychain (run: wails3 setup signing)
|
|
deps:
|
|
- task: create:nsis:installer
|
|
cmds:
|
|
- wails3 tool sign --input "build/windows/nsis/{{.APP_NAME}}-installer.exe" {{if .SIGN_CERTIFICATE}}--certificate {{.SIGN_CERTIFICATE}}{{end}} {{if .SIGN_THUMBPRINT}}--thumbprint {{.SIGN_THUMBPRINT}}{{end}} {{if .TIMESTAMP_SERVER}}--timestamp {{.TIMESTAMP_SERVER}}{{end}}
|
|
preconditions:
|
|
- sh: '[ -n "{{.SIGN_CERTIFICATE}}" ] || [ -n "{{.SIGN_THUMBPRINT}}" ]'
|
|
msg: "Either SIGN_CERTIFICATE or SIGN_THUMBPRINT is required. Set it in the vars section at the top of build/windows/Taskfile.yml"
|