286 lines
6.4 KiB
Bash
286 lines
6.4 KiB
Bash
![]() |
#!/bin/bash
|
||
|
|
||
|
# Rustelo Development Installer
|
||
|
# Simple setup script for development environment
|
||
|
|
||
|
set -e
|
||
|
|
||
|
# Colors for output
|
||
|
RED='\033[0;31m'
|
||
|
GREEN='\033[0;32m'
|
||
|
YELLOW='\033[1;33m'
|
||
|
BLUE='\033[0;34m'
|
||
|
NC='\033[0m' # No Color
|
||
|
|
||
|
# Project settings
|
||
|
PROJECT_NAME="my-rustelo-app"
|
||
|
TEMPLATE_DIR="$(pwd)/template"
|
||
|
|
||
|
# Functions
|
||
|
log() {
|
||
|
echo -e "${GREEN}[INFO]${NC} $1"
|
||
|
}
|
||
|
|
||
|
log_warn() {
|
||
|
echo -e "${YELLOW}[WARN]${NC} $1"
|
||
|
}
|
||
|
|
||
|
log_error() {
|
||
|
echo -e "${RED}[ERROR]${NC} $1"
|
||
|
}
|
||
|
|
||
|
print_header() {
|
||
|
echo -e "${BLUE}$1${NC}"
|
||
|
}
|
||
|
|
||
|
print_success() {
|
||
|
echo -e "${GREEN}✓${NC} $1"
|
||
|
}
|
||
|
|
||
|
# Check if command exists
|
||
|
command_exists() {
|
||
|
command -v "$1" >/dev/null 2>&1
|
||
|
}
|
||
|
|
||
|
# Check system requirements
|
||
|
check_requirements() {
|
||
|
log "Checking system requirements..."
|
||
|
|
||
|
local missing=()
|
||
|
|
||
|
if ! command_exists git; then
|
||
|
missing+=("git")
|
||
|
fi
|
||
|
|
||
|
if ! command_exists rustc; then
|
||
|
missing+=("rust (install from https://rustup.rs/)")
|
||
|
fi
|
||
|
|
||
|
if ! command_exists node; then
|
||
|
missing+=("node.js (install from https://nodejs.org/)")
|
||
|
fi
|
||
|
|
||
|
if ! command_exists cargo-leptos; then
|
||
|
log_warn "cargo-leptos not found, will install it"
|
||
|
fi
|
||
|
|
||
|
if [ ${#missing[@]} -gt 0 ]; then
|
||
|
log_error "Missing required dependencies: ${missing[*]}"
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
print_success "System requirements check passed"
|
||
|
}
|
||
|
|
||
|
# Install Rust tools
|
||
|
install_rust_tools() {
|
||
|
log "Installing Rust tools..."
|
||
|
|
||
|
if ! command_exists cargo-leptos; then
|
||
|
log "Installing cargo-leptos..."
|
||
|
cargo install cargo-leptos
|
||
|
fi
|
||
|
|
||
|
print_success "Rust tools installed"
|
||
|
}
|
||
|
|
||
|
# Create new project
|
||
|
create_project() {
|
||
|
# Get project name from user
|
||
|
echo -n "Enter project name [$PROJECT_NAME]: "
|
||
|
read -r input
|
||
|
if [ -n "$input" ]; then
|
||
|
PROJECT_NAME="$input"
|
||
|
fi
|
||
|
|
||
|
# Check if directory exists
|
||
|
if [ -d "$PROJECT_NAME" ]; then
|
||
|
log_error "Directory '$PROJECT_NAME' already exists!"
|
||
|
echo -n "Remove existing directory? (y/N): "
|
||
|
read -r confirm
|
||
|
if [[ "$confirm" =~ ^[Yy]$ ]]; then
|
||
|
rm -rf "$PROJECT_NAME"
|
||
|
else
|
||
|
exit 1
|
||
|
fi
|
||
|
fi
|
||
|
|
||
|
log "Creating project: $PROJECT_NAME"
|
||
|
|
||
|
# Copy template
|
||
|
cp -r "$TEMPLATE_DIR" "$PROJECT_NAME"
|
||
|
cd "$PROJECT_NAME"
|
||
|
|
||
|
# Update project name in Cargo.toml
|
||
|
if [ -f "Cargo.toml" ]; then
|
||
|
sed -i.bak "s/name = \"rustelo\"/name = \"$PROJECT_NAME\"/" Cargo.toml
|
||
|
rm -f Cargo.toml.bak
|
||
|
fi
|
||
|
|
||
|
print_success "Project created: $PROJECT_NAME"
|
||
|
}
|
||
|
|
||
|
# Setup environment
|
||
|
setup_environment() {
|
||
|
log "Setting up development environment..."
|
||
|
|
||
|
# Create .env file
|
||
|
if [ ! -f ".env" ]; then
|
||
|
cat > ".env" << EOF
|
||
|
# Development Environment Configuration
|
||
|
ENVIRONMENT=dev
|
||
|
|
||
|
# Server Configuration
|
||
|
SERVER_HOST=127.0.0.1
|
||
|
SERVER_PORT=3030
|
||
|
SERVER_PROTOCOL=http
|
||
|
|
||
|
# Database Configuration
|
||
|
DATABASE_URL=postgresql://dev:dev@localhost:5432/${PROJECT_NAME}_dev
|
||
|
|
||
|
# Session Configuration
|
||
|
SESSION_SECRET=dev-secret-not-for-production
|
||
|
|
||
|
# Features
|
||
|
ENABLE_AUTH=true
|
||
|
ENABLE_CONTENT_DB=true
|
||
|
ENABLE_TLS=false
|
||
|
|
||
|
# Logging
|
||
|
LOG_LEVEL=debug
|
||
|
RUST_LOG=debug
|
||
|
EOF
|
||
|
log "Created .env file"
|
||
|
fi
|
||
|
|
||
|
# Create necessary directories
|
||
|
mkdir -p public uploads logs cache config data
|
||
|
|
||
|
print_success "Environment configured"
|
||
|
}
|
||
|
|
||
|
# Install dependencies
|
||
|
install_dependencies() {
|
||
|
log "Installing dependencies..."
|
||
|
|
||
|
# Install Rust dependencies
|
||
|
log "Fetching Rust dependencies..."
|
||
|
cargo fetch
|
||
|
|
||
|
# Install Node.js dependencies
|
||
|
if [ -f "package.json" ]; then
|
||
|
log "Installing Node.js dependencies..."
|
||
|
if command_exists pnpm; then
|
||
|
pnpm install
|
||
|
else
|
||
|
npm install
|
||
|
fi
|
||
|
fi
|
||
|
|
||
|
print_success "Dependencies installed"
|
||
|
}
|
||
|
|
||
|
# Build project
|
||
|
build_project() {
|
||
|
log "Building project..."
|
||
|
|
||
|
# Build CSS
|
||
|
if [ -f "package.json" ]; then
|
||
|
log "Building CSS..."
|
||
|
if command_exists pnpm; then
|
||
|
pnpm run build:css
|
||
|
else
|
||
|
npm run build:css
|
||
|
fi
|
||
|
fi
|
||
|
|
||
|
# Build Rust project
|
||
|
log "Building Rust code..."
|
||
|
cargo build
|
||
|
|
||
|
print_success "Project built successfully"
|
||
|
}
|
||
|
|
||
|
# Setup development scripts
|
||
|
setup_scripts() {
|
||
|
log "Creating development scripts..."
|
||
|
|
||
|
# Create start script
|
||
|
cat > "start.sh" << EOF
|
||
|
#!/bin/bash
|
||
|
# Start development server
|
||
|
cd "\$(dirname "\$0")"
|
||
|
cargo leptos watch
|
||
|
EOF
|
||
|
chmod +x "start.sh"
|
||
|
|
||
|
# Create build script
|
||
|
cat > "build.sh" << EOF
|
||
|
#!/bin/bash
|
||
|
# Build for production
|
||
|
cd "\$(dirname "\$0")"
|
||
|
cargo leptos build --release
|
||
|
EOF
|
||
|
chmod +x "build.sh"
|
||
|
|
||
|
print_success "Development scripts created"
|
||
|
}
|
||
|
|
||
|
# Display final instructions
|
||
|
show_instructions() {
|
||
|
echo
|
||
|
print_header "╭─────────────────────────────────────────────────────────╮"
|
||
|
print_header "│ DEVELOPMENT SETUP COMPLETE │"
|
||
|
print_header "╰─────────────────────────────────────────────────────────╯"
|
||
|
echo
|
||
|
|
||
|
print_success "Project '$PROJECT_NAME' is ready for development!"
|
||
|
echo
|
||
|
echo "Next steps:"
|
||
|
echo "1. cd $PROJECT_NAME"
|
||
|
echo "2. ./start.sh (or: cargo leptos watch)"
|
||
|
echo "3. Open http://127.0.0.1:3030 in your browser"
|
||
|
echo
|
||
|
echo "Available commands:"
|
||
|
echo " ./start.sh - Start development server"
|
||
|
echo " ./build.sh - Build for production"
|
||
|
echo " cargo leptos watch - Start with hot reload"
|
||
|
echo " cargo build - Build Rust code only"
|
||
|
echo " npm run dev - Watch CSS changes"
|
||
|
echo
|
||
|
echo "Configuration:"
|
||
|
echo " .env - Environment variables"
|
||
|
echo " Cargo.toml - Rust dependencies"
|
||
|
echo " package.json - Node.js dependencies"
|
||
|
echo
|
||
|
print_success "Happy coding! 🚀"
|
||
|
}
|
||
|
|
||
|
# Main installation
|
||
|
main() {
|
||
|
print_header "Rustelo Development Setup"
|
||
|
echo
|
||
|
|
||
|
# Check if we're in the right directory
|
||
|
if [ ! -d "$TEMPLATE_DIR" ]; then
|
||
|
log_error "Template directory not found: $TEMPLATE_DIR"
|
||
|
log_error "Please run this script from the Rustelo project root"
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
# Run setup steps
|
||
|
check_requirements
|
||
|
install_rust_tools
|
||
|
create_project
|
||
|
setup_environment
|
||
|
install_dependencies
|
||
|
build_project
|
||
|
setup_scripts
|
||
|
|
||
|
# Show final instructions
|
||
|
show_instructions
|
||
|
}
|
||
|
|
||
|
# Run main function
|
||
|
main "$@"
|