mirror of
https://github.com/kuhyx/todo-app.git
synced 2026-07-04 10:03:39 +02:00
Add run.sh to install Flutter desktop deps and launch the app
Provides a one-command setup for Arch Linux (builds flutter-bin from the AUR via makepkg) and Ubuntu/Debian (apt if a flutter package exists, otherwise the upstream SDK clone), plus the Linux desktop build toolchain, then runs `flutter run -d linux`. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
ca93791bf9
commit
dac6bd6737
129
run.sh
Executable file
129
run.sh
Executable file
@ -0,0 +1,129 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# run.sh — install missing Flutter + Linux-desktop build dependencies, then
|
||||
# launch the todo app on Arch Linux or Ubuntu/Debian.
|
||||
#
|
||||
# Usage: ./run.sh
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
readonly SCRIPT_DIR
|
||||
readonly AUR_FLUTTER_BIN_URL="https://aur.archlinux.org/flutter-bin.git"
|
||||
|
||||
BUILD_DIR=""
|
||||
cleanup() {
|
||||
if [[ -n "${BUILD_DIR}" && -d "${BUILD_DIR}" ]]; then
|
||||
rm -rf "${BUILD_DIR}"
|
||||
fi
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
log() { printf '==> %s\n' "$1"; }
|
||||
err() { printf 'error: %s\n' "$1" >&2; }
|
||||
|
||||
# Echoes "arch" or "debian" depending on /etc/os-release; exits otherwise.
|
||||
detect_distro() {
|
||||
if [[ -f /etc/os-release ]]; then
|
||||
# shellcheck disable=SC1091
|
||||
source /etc/os-release
|
||||
case "${ID:-}:${ID_LIKE:-}" in
|
||||
*arch*) echo "arch"; return ;;
|
||||
*debian*|*ubuntu*) echo "debian"; return ;;
|
||||
esac
|
||||
fi
|
||||
err "unsupported distro (expected Arch Linux or Ubuntu/Debian)"
|
||||
exit 1
|
||||
}
|
||||
|
||||
require_non_root() {
|
||||
if [[ "${EUID}" -eq 0 ]]; then
|
||||
err "run as a regular user with sudo access, not as root (makepkg/apt need that)"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# makepkg refuses to run as root, so flutter-bin is built directly from its
|
||||
# AUR git repo rather than requiring an AUR helper (yay/paru) to be installed.
|
||||
install_flutter_arch() {
|
||||
command -v flutter >/dev/null 2>&1 && return
|
||||
log "flutter not found; building flutter-bin from the AUR"
|
||||
sudo pacman -S --needed --noconfirm base-devel git
|
||||
BUILD_DIR="$(mktemp -d)"
|
||||
git clone --depth 1 "${AUR_FLUTTER_BIN_URL}" "${BUILD_DIR}/flutter-bin"
|
||||
(cd "${BUILD_DIR}/flutter-bin" && makepkg -si --noconfirm)
|
||||
}
|
||||
|
||||
install_linux_desktop_deps_arch() {
|
||||
local -a pkgs=(clang cmake ninja pkgconf gtk3)
|
||||
local -a missing=()
|
||||
for pkg in "${pkgs[@]}"; do
|
||||
pacman -Qi "${pkg}" >/dev/null 2>&1 || missing+=("${pkg}")
|
||||
done
|
||||
if ((${#missing[@]} > 0)); then
|
||||
log "installing missing build deps: ${missing[*]}"
|
||||
sudo pacman -S --needed --noconfirm "${missing[@]}"
|
||||
fi
|
||||
}
|
||||
|
||||
# Prefers a real apt package if the user's mirrors happen to carry one;
|
||||
# Ubuntu/Debian have none in the standard repos as of writing, so this
|
||||
# normally falls back to cloning the upstream Flutter SDK.
|
||||
install_flutter_debian() {
|
||||
command -v flutter >/dev/null 2>&1 && return
|
||||
log "flutter not found; checking apt for a flutter package"
|
||||
sudo apt-get update -qq
|
||||
if apt-cache show flutter >/dev/null 2>&1; then
|
||||
sudo apt-get install -y flutter
|
||||
return
|
||||
fi
|
||||
log "no apt package named 'flutter'; cloning the Flutter SDK instead"
|
||||
local install_dir="${HOME}/development/flutter"
|
||||
if [[ ! -d "${install_dir}" ]]; then
|
||||
sudo apt-get install -y git curl
|
||||
git clone --depth 1 -b stable https://github.com/flutter/flutter.git "${install_dir}"
|
||||
fi
|
||||
export PATH="${install_dir}/bin:${PATH}"
|
||||
log "flutter installed at ${install_dir}; add 'export PATH=\"${install_dir}/bin:\$PATH\"' to your shell rc to make this permanent"
|
||||
}
|
||||
|
||||
install_linux_desktop_deps_debian() {
|
||||
local -a pkgs=(clang cmake ninja-build pkg-config libgtk-3-dev liblzma-dev)
|
||||
local -a missing=()
|
||||
for pkg in "${pkgs[@]}"; do
|
||||
dpkg -s "${pkg}" >/dev/null 2>&1 || missing+=("${pkg}")
|
||||
done
|
||||
if ((${#missing[@]} > 0)); then
|
||||
log "installing missing build deps: ${missing[*]}"
|
||||
sudo apt-get update -qq
|
||||
sudo apt-get install -y "${missing[@]}"
|
||||
fi
|
||||
}
|
||||
|
||||
main() {
|
||||
require_non_root
|
||||
local distro
|
||||
distro="$(detect_distro)"
|
||||
|
||||
case "${distro}" in
|
||||
arch)
|
||||
install_flutter_arch
|
||||
install_linux_desktop_deps_arch
|
||||
;;
|
||||
debian)
|
||||
install_flutter_debian
|
||||
install_linux_desktop_deps_debian
|
||||
;;
|
||||
esac
|
||||
|
||||
command -v flutter >/dev/null 2>&1 || { err "flutter still not on PATH after install"; exit 1; }
|
||||
|
||||
cd "${SCRIPT_DIR}"
|
||||
flutter config --enable-linux-desktop >/dev/null
|
||||
log "fetching pub packages"
|
||||
flutter pub get
|
||||
log "launching the app"
|
||||
exec flutter run -d linux
|
||||
}
|
||||
|
||||
main "$@"
|
||||
Loading…
Reference in New Issue
Block a user