commit da5ae005af09546824072a8e3ed7cbba4ae265bc Author: Astrian Zheng Date: Sat Jun 28 11:01:30 2025 +1000 Initial commit: macOS setup script with Parallels Desktop 🚀 Features: - Single install.sh script with interactive menu - 19 essential applications including Parallels Desktop - Automatic Homebrew, Xcode CLI tools, nvm, Node.js setup - 1Password SSH Agent and Touch ID sudo configuration - Neovim configuration cloning - Command aliases (cc, vi/vim, ping) - Oh My Zsh installation - Multiple installation options (full, apps-only, dev-only, config-only) 🛠️ Generated with Claude Code Co-Authored-By: Claude diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6ad2e65 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.DS_Store +*.log +*.tmp +*~ +.idea/ +.vscode/ \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..e228456 --- /dev/null +++ b/README.md @@ -0,0 +1,113 @@ +# macOS 快速设置工具 + +一个简单而强大的脚本,用于在新 Mac 或重装后快速配置开发环境。 + +## 🚀 一键安装 + +```bash +bash -c "$(curl -fsSL https://raw.githubusercontent.com/Astrian/mac-setup/main/install.sh)" +``` + +或者本地运行: + +```bash +bash ~/.mac-setup/install.sh +``` + +## ✨ 功能特性 + +- 🍺 自动安装 Homebrew 和常用应用 +- 🔐 配置 1Password SSH Agent 和 Touch ID sudo +- ⚙️ 自动应用 Neovim 配置 +- 📱 安装开发工具和生产力应用 +- 🎨 配置字体和终端环境 +- 🎯 提供多种安装选项 + +## 📱 包含的应用 + +### 生产力工具 +- **微信/QQ** - 社交通讯 +- **Discord** - 团队协作 +- **Alfred** - 启动器和搜索工具 +- **1Password** - 密码管理器 +- **Setapp** - 应用订阅服务 +- **Ice** - 菜单栏管理 + +### 开发工具 +- **iTerm2** - 终端仿真器 +- **Neovim** - 现代化编辑器 +- **Docker Desktop** - 容器平台 +- **xcodes** - Xcode 版本管理 +- **GPG Suite** - 加密工具 + +### 浏览器和网络 +- **Dia** - AI 浏览器 +- **Tailscale** - 零配置 VPN +- **Private Internet Access** - 商业 VPN + +### 虚拟化和游戏 +- **Parallels Desktop** - 虚拟机软件 +- **MuMu Player** - Android 模拟器 +- **MAA** - 明日方舟助手 + +### 其他工具 +- **Synology Drive** - 文件同步 +- **MailMate** - 专业邮件客户端 +- **Fira Code Nerd Font** - 编程字体 + +## 🎯 安装选项 + +脚本提供了 4 种安装选项: + +1. **完整安装(推荐)** - 安装所有应用和配置 +2. **仅安装应用** - 只安装 Homebrew 和应用程序 +3. **仅开发环境** - 配置开发工具和环境 +4. **仅配置** - 配置 SSH 和别名 + +## 🔧 配置内容 + +### 自动配置 +- ✅ Homebrew 自动安装和配置 +- ✅ 1Password SSH Agent +- ✅ Touch ID sudo 支持 +- ✅ Oh My Zsh +- ✅ Node.js LTS (通过 nvm) +- ✅ Claude Code CLI + +### 别名设置 +- `cc` → `claude --dangerously-skip-permissions` +- `vi` / `vim` → `nvim` +- `ping` → `prettyping --nolegend` + +## 💻 系统要求 + +- macOS 10.15+ (推荐 macOS 12+) +- 支持 Apple Silicon 和 Intel Mac +- 网络连接 + +## 🛠️ 故障排除 + +### Homebrew 安装失败 +```bash +# 手动安装 Homebrew +/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" +``` + +### SSH 克隆失败 +- 确保 1Password 已安装并启用 SSH Agent +- 在 1Password 中添加你的 SSH 密钥 +- 测试连接:`ssh -T git@git.nas.astrian.moe` + +### 应用安装失败 +```bash +# 手动安装单个应用 +brew install --cask app-name +``` + +## 📄 许可证 + +MIT License + +## 🤝 贡献 + +欢迎提交 Issue 和 Pull Request! \ No newline at end of file diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..973952e --- /dev/null +++ b/install.sh @@ -0,0 +1,401 @@ +#!/bin/bash + +# macOS 快速设置 - 完整安装脚本 +# 用法: bash -c "$(curl -fsSL https://raw.githubusercontent.com/Astrian/mac-setup/main/install.sh)" +# 本地: bash ~/.mac-setup/install.sh + +set -e + +# 颜色定义 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +PURPLE='\033[0;35m' +CYAN='\033[0;36m' +NC='\033[0m' # No Color + +# 打印带颜色的消息 +print_message() { + echo -e "${2}${1}${NC}" +} + +print_message "🍎 macOS 快速设置工具" "$CYAN" +print_message "=====================" "$CYAN" +echo "" + +# 检查网络连接 +check_network() { + if ! ping -c 1 github.com &> /dev/null; then + print_message "❌ 网络连接失败,请检查网络设置" "$RED" + exit 1 + fi +} + +# 预先获取 sudo 权限 +get_sudo() { + print_message "🔐 需要管理员权限..." "$YELLOW" + sudo -v + # 保持 sudo 权限活跃 + while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null & +} + +# 配置 sudo Touch ID +setup_sudo_touchid() { + print_message "👆 配置 sudo Touch ID..." "$BLUE" + if grep -q "auth.*sufficient.*pam_tid.so" /etc/pam.d/sudo_local 2>/dev/null; then + print_message "✅ Touch ID 已配置" "$GREEN" + else + sudo sed -i '' 's/^#auth.*sufficient.*pam_tid.so/auth sufficient pam_tid.so/' /etc/pam.d/sudo_local 2>/dev/null || true + print_message "✅ Touch ID 配置完成" "$GREEN" + fi +} + +# 安装 Xcode Command Line Tools +install_xcode_tools() { + print_message "🛠️ 检查 Xcode Command Line Tools..." "$BLUE" + if xcode-select -p &>/dev/null; then + print_message "✅ Xcode Command Line Tools 已安装" "$GREEN" + else + print_message "📥 安装 Xcode Command Line Tools..." "$YELLOW" + xcode-select --install + print_message "⏳ 请在弹出的窗口中完成安装,然后重新运行此脚本" "$YELLOW" + exit 0 + fi +} + +# 安装 Homebrew +install_homebrew() { + if ! command -v brew &> /dev/null; then + print_message "📦 安装 Homebrew..." "$BLUE" + /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" + + # 检测系统架构并添加 Homebrew 到 PATH + if [[ $(uname -m) == "arm64" ]]; then + echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile + eval "$(/opt/homebrew/bin/brew shellenv)" + else + echo 'eval "$(/usr/local/bin/brew shellenv)"' >> ~/.zprofile + eval "$(/usr/local/bin/brew shellenv)" + fi + + print_message "✅ Homebrew 安装成功!" "$GREEN" + else + print_message "✅ Homebrew 已安装" "$GREEN" + fi +} + +# 安装 xcodes +install_xcodes() { + print_message "📱 安装 xcodes (Xcode 版本管理工具)..." "$BLUE" + if command -v xcodes &> /dev/null; then + print_message "✅ xcodes 已安装" "$GREEN" + else + brew install xcodesorg/made/xcodes + brew install aria2 + print_message "✅ xcodes 安装成功!" "$GREEN" + fi +} + +# 安装应用列表 +install_apps() { + print_message "📱 安装应用程序..." "$BLUE" + + # 应用程序列表 + apps=( + "wechat" # 微信 + "qq" # QQ + "discord" # Discord + "setapp" # Setapp + "jordanbaird-ice" # Ice - macOS 菜单栏管理工具 + "alfred" # Alfred - 效率启动器 + "1password" # 1Password - 密码管理器 + "iterm2" # iTerm2 - 终端仿真器 + "synology-drive" # Synology Drive Client - 文件同步工具 + "thebrowsercompany-dia" # Dia - AI 浏览器 + "docker-desktop" # Docker Desktop - 容器管理平台 + "gpg-suite" # GPG Suite - PGP 加密工具包 + "mailmate" # MailMate - 专业邮件客户端 + "mumuplayer" # MuMu Player Pro - Android 模拟器 + "maa" # MAA - 明日方舟助手 + "tailscale-app" # Tailscale - 零配置 VPN + "private-internet-access" # Private Internet Access - VPN 服务 + "parallels" # Parallels Desktop - 虚拟机软件 + "font-fira-code-nerd-font" # Fira Code Nerd Font - 编程字体 + ) + + total=${#apps[@]} + installed=0 + failed=0 + + for app in "${apps[@]}"; do + print_message "📦 正在安装: $app" "$YELLOW" + if brew install --cask "$app" 2>/dev/null; then + print_message "✅ $app 安装成功!" "$GREEN" + ((installed++)) + else + print_message "❌ $app 安装失败或已存在" "$RED" + ((failed++)) + fi + done + + print_message "=========================================" "$CYAN" + print_message "📊 应用安装完成!" "$CYAN" + print_message " 总计: $total 个应用" "$CYAN" + print_message " 成功: $installed 个" "$GREEN" + print_message " 失败/已存在: $failed 个" "$RED" + print_message "=========================================" "$CYAN" +} + +# 安装命令行工具 +install_cli_tools() { + print_message "🛠️ 安装命令行工具..." "$BLUE" + + # Neovim + if command -v nvim &> /dev/null; then + print_message "✅ Neovim 已安装" "$GREEN" + else + brew install neovim + print_message "✅ Neovim 安装成功!" "$GREEN" + fi + + # prettyping + if command -v prettyping &> /dev/null; then + print_message "✅ prettyping 已安装" "$GREEN" + else + brew install prettyping + print_message "✅ prettyping 安装成功!" "$GREEN" + fi +} + +# 配置 SSH +setup_ssh() { + print_message "🔐 配置 SSH..." "$BLUE" + mkdir -p ~/.ssh + chmod 700 ~/.ssh + + # 配置 1Password SSH Agent + if ! grep -q "IdentityAgent" ~/.ssh/config 2>/dev/null; then + print_message " 配置 1Password SSH Agent..." "$YELLOW" + cat >> ~/.ssh/config << 'EOF' +Host * + IdentityAgent "~/Library/Group Containers/2BUA8C4S2C.com.1password/t/agent.sock" + +EOF + chmod 600 ~/.ssh/config + print_message "✅ SSH Agent 配置完成" "$GREEN" + else + print_message "✅ SSH Agent 已配置" "$GREEN" + fi + + # 添加常用 Git 服务器指纹 + print_message " 添加 Git 服务器指纹..." "$YELLOW" + ssh-keyscan -H git.nas.astrian.moe >> ~/.ssh/known_hosts 2>/dev/null + ssh-keyscan -H github.com >> ~/.ssh/known_hosts 2>/dev/null + ssh-keyscan -H gitlab.com >> ~/.ssh/known_hosts 2>/dev/null +} + +# 安装 Oh My Zsh +install_oh_my_zsh() { + print_message "🌈 安装 Oh My Zsh..." "$PURPLE" + if [ -d "$HOME/.oh-my-zsh" ]; then + print_message "✅ Oh My Zsh 已安装" "$GREEN" + else + sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended + print_message "✅ Oh My Zsh 安装成功!" "$GREEN" + fi +} + +# 安装 nvm 和 Node.js +install_node() { + print_message "🔧 安装 nvm 和 Node.js..." "$BLUE" + + if [ -s "$HOME/.nvm/nvm.sh" ]; then + print_message "✅ nvm 已安装" "$GREEN" + else + curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash + export NVM_DIR="$HOME/.nvm" + [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" + print_message "✅ nvm 安装成功!" "$GREEN" + fi + + # 确保 nvm 已加载 + export NVM_DIR="$HOME/.nvm" + [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" + + print_message "📦 安装 Node.js LTS..." "$YELLOW" + nvm install --lts + nvm use --lts + nvm alias default lts/* + print_message "✅ Node.js LTS 安装成功!" "$GREEN" +} + +# 安装 Claude Code CLI +install_claude_code() { + print_message "🤖 安装 Claude Code CLI..." "$BLUE" + npm install -g @anthropic-ai/claude-code + print_message "✅ Claude Code CLI 安装成功!" "$GREEN" +} + +# 配置 zsh 别名 +setup_aliases() { + print_message "⚙️ 配置 zsh 别名..." "$BLUE" + + # Claude Code 别名 + if ! grep -q 'alias cc=' "$HOME/.zshrc" 2>/dev/null; then + echo '' >> "$HOME/.zshrc" + echo '# Claude Code CLI alias' >> "$HOME/.zshrc" + echo 'alias cc="claude --dangerously-skip-permissions"' >> "$HOME/.zshrc" + fi + + # vi/vim 别名 + if ! grep -q 'alias vi=' "$HOME/.zshrc" 2>/dev/null; then + echo '# Neovim alias' >> "$HOME/.zshrc" + echo 'alias vi="nvim"' >> "$HOME/.zshrc" + echo 'alias vim="nvim"' >> "$HOME/.zshrc" + fi + + # ping 别名 + if ! grep -q 'alias ping=' "$HOME/.zshrc" 2>/dev/null; then + echo '# prettyping alias' >> "$HOME/.zshrc" + echo 'alias ping="prettyping --nolegend"' >> "$HOME/.zshrc" + fi + + print_message "✅ 别名配置完成" "$GREEN" +} + +# 配置 Neovim +setup_neovim() { + print_message "⚙️ 配置 Neovim..." "$BLUE" + if command -v nvim &> /dev/null; then + mkdir -p ~/.config + + if [ -d ~/.config/nvim ]; then + print_message "⚠️ 备份现有 nvim 配置..." "$YELLOW" + mv ~/.config/nvim ~/.config/nvim.backup.$(date +%Y%m%d_%H%M%S) + fi + + print_message "📥 克隆 nvim 配置..." "$YELLOW" + if git clone git@git.nas.astrian.moe:Astrian/nvim-config.git ~/.config/nvim 2>/dev/null; then + print_message "✅ Neovim 配置已应用!" "$GREEN" + else + print_message "⚠️ 无法克隆 nvim 配置(SSH 密钥未配置)" "$YELLOW" + fi + fi +} + +# 显示菜单 +show_menu() { + echo "" + print_message "请选择安装选项:" "$CYAN" + echo "1) 完整安装(推荐)" + echo "2) 仅安装 Homebrew 和应用" + echo "3) 仅配置开发环境" + echo "4) 仅配置 SSH 和别名" + echo "0) 退出" + echo "" + read -p "请输入选项 [0-4]: " choice +} + +# 完整安装 +full_install() { + print_message "🚀 开始完整安装..." "$CYAN" + echo "" + + check_network + get_sudo + setup_sudo_touchid + install_xcode_tools + install_homebrew + install_xcodes + install_apps + install_cli_tools + setup_ssh + install_oh_my_zsh + install_node + install_claude_code + setup_aliases + setup_neovim + + echo "" + print_message "=========================================" "$CYAN" + print_message "🎉 完整安装完成!" "$GREEN" + print_message "=========================================" "$CYAN" + echo "" + print_message "💡 提示:" "$YELLOW" + print_message " 1. 重启终端或运行 'source ~/.zshrc' 激活配置" "$YELLOW" + print_message " 2. 使用 'cc' 命令启动 Claude Code" "$YELLOW" + print_message " 3. 使用 'vi' 命令启动 Neovim" "$YELLOW" + print_message " 4. 首次启动 nvim 时会自动安装插件" "$YELLOW" +} + +# 仅安装应用 +apps_only() { + print_message "📱 仅安装应用..." "$CYAN" + check_network + get_sudo + install_xcode_tools + install_homebrew + install_xcodes + install_apps + print_message "✅ 应用安装完成!" "$GREEN" +} + +# 仅开发环境 +dev_only() { + print_message "🛠️ 仅配置开发环境..." "$CYAN" + install_cli_tools + install_oh_my_zsh + install_node + install_claude_code + setup_neovim + print_message "✅ 开发环境配置完成!" "$GREEN" +} + +# 仅配置 +config_only() { + print_message "⚙️ 仅配置 SSH 和别名..." "$CYAN" + setup_ssh + setup_aliases + print_message "✅ 配置完成!" "$GREEN" +} + +# 检查是否为交互式调用 +if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then + # 如果有参数,直接运行完整安装 + if [[ $# -gt 0 && $1 == "--full" ]]; then + full_install + exit 0 + fi + + # 显示菜单 + while true; do + show_menu + + case $choice in + 1) + full_install + break + ;; + 2) + apps_only + break + ;; + 3) + dev_only + break + ;; + 4) + config_only + break + ;; + 0) + print_message "👋 再见!" "$CYAN" + exit 0 + ;; + *) + print_message "❌ 无效选项,请重试" "$RED" + ;; + esac + done +fi \ No newline at end of file