Files
LanMountainDesktop/scripts/build.sh
lincube e8276c4d1e 0.2.7
修改天气组件,ci工作流
2026-03-04 02:02:34 +08:00

221 lines
4.9 KiB
Bash
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# LanMontainDesktop Build Script for Linux/macOS
# Usage: ./build.sh [options]
# Example: ./build.sh --project LanMontainDesktop.csproj --rid linux-x64 --version 1.0.0
set -e
# Default values
PROJECT="LanMontainDesktop/LanMontainDesktop.csproj"
CONFIGURATION="Release"
RID=""
VERSION=""
PUBLISH_DIR=""
SKIP_RESTORE=false
VERBOSE=false
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Functions
print_error() {
echo -e "${RED}❌ Error: $1${NC}" >&2
}
print_success() {
echo -e "${GREEN}$1${NC}"
}
print_info() {
echo -e "${BLUE} $1${NC}"
}
print_warning() {
echo -e "${YELLOW}⚠️ $1${NC}"
}
show_help() {
cat << EOF
LanMontainDesktop Build Script for Linux/macOS
Usage: $0 [options]
Options:
-p, --project PATH Project file path (default: LanMontainDesktop/LanMontainDesktop.csproj)
-c, --config CONFIG Configuration: Release/Debug (default: Release)
-r, --rid RID Runtime Identifier: linux-x64, osx-x64, osx-arm64 (required)
-v, --version VERSION Version number (default: read from csproj)
-o, --output DIR Output directory for publish
--skip-restore Skip dotnet restore
--verbose Verbose output
-h, --help Show this help message
Examples:
./build.sh --rid linux-x64 --version 1.0.0
./build.sh --rid osx-x64 --output ./publish
./build.sh --project LanMontainDesktop/LanMontainDesktop.csproj --rid osx-arm64
EOF
}
# Parse arguments
while [[ $# -gt 0 ]]; do
case $1 in
-p|--project)
PROJECT="$2"
shift 2
;;
-c|--config)
CONFIGURATION="$2"
shift 2
;;
-r|--rid)
RID="$2"
shift 2
;;
-v|--version)
VERSION="$2"
shift 2
;;
-o|--output)
PUBLISH_DIR="$2"
shift 2
;;
--skip-restore)
SKIP_RESTORE=true
shift
;;
--verbose)
VERBOSE=true
shift
;;
-h|--help)
show_help
exit 0
;;
*)
print_error "Unknown option: $1"
show_help
exit 1
;;
esac
done
# Validation
if [ -z "$RID" ]; then
print_error "Runtime Identifier (--rid) is required"
show_help
exit 1
fi
if [ ! -f "$PROJECT" ]; then
print_error "Project file not found: $PROJECT"
exit 1
fi
# Detect OS
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
OS="linux"
DETECTED_RID="linux-x64"
elif [[ "$OSTYPE" == "darwin"* ]]; then
OS="macos"
# Try to detect architecture
if [ "$(uname -m)" == "arm64" ]; then
DETECTED_RID="osx-arm64"
else
DETECTED_RID="osx-x64"
fi
else
print_error "Unsupported OS: $OSTYPE"
exit 1
fi
print_info "Detected OS: $OS ($DETECTED_RID)"
print_info "Target RID: $RID"
# Read version from csproj if not provided
if [ -z "$VERSION" ]; then
VERSION=$(grep -oP '<Version>\K[^<]*' "$PROJECT" | head -1)
if [ -z "$VERSION" ]; then
VERSION="1.0.0"
print_warning "No version found in csproj, using default: $VERSION"
fi
fi
print_info "Version: $VERSION"
print_info "Configuration: $CONFIGURATION"
# Set output directory
if [ -z "$PUBLISH_DIR" ]; then
PUBLISH_DIR="./publish/$RID"
fi
print_info "Output directory: $PUBLISH_DIR"
# Restore dependencies
if [ "$SKIP_RESTORE" = false ]; then
print_info "Restoring dependencies..."
if [ "$VERBOSE" = true ]; then
dotnet restore --verbosity detailed
else
dotnet restore
fi
print_success "Dependencies restored"
fi
# Build
print_info "Building..."
if [ "$VERBOSE" = true ]; then
dotnet build "$PROJECT" \
-c "$CONFIGURATION" \
--no-restore \
--verbosity detailed
else
dotnet build "$PROJECT" -c "$CONFIGURATION" --no-restore
fi
print_success "Build completed"
# Publish
print_info "Publishing..."
PUBLISH_ARGS=(
"$PROJECT"
"-c" "$CONFIGURATION"
"-o" "$PUBLISH_DIR"
"-r" "$RID"
"--self-contained"
)
# Add platform-specific publish options
if [ "$VERBOSE" = true ]; then
PUBLISH_ARGS+=("--verbosity" "detailed")
fi
dotnet publish "${PUBLISH_ARGS[@]}" \
-p:PublishSingleFile=true \
-p:PublishTrimmed=false \
-p:DebugType=embedded \
-p:DebugSymbols=false
print_success "Published to: $PUBLISH_DIR"
# Show result
if [ -d "$PUBLISH_DIR" ]; then
SIZE=$(du -sh "$PUBLISH_DIR" | cut -f1)
FILE_COUNT=$(find "$PUBLISH_DIR" -type f | wc -l)
print_success "Build complete! Output size: $SIZE ($FILE_COUNT files)"
if [ "$VERBOSE" = true ]; then
print_info "Output contents:"
ls -lh "$PUBLISH_DIR"
fi
else
print_error "Publish directory not found"
exit 1
fi
print_success "Done!"