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 <noreply@anthropic.com>
This commit is contained in:
commit
da5ae005af
6
.gitignore
vendored
Normal file
6
.gitignore
vendored
Normal file
|
@ -0,0 +1,6 @@
|
|||
.DS_Store
|
||||
*.log
|
||||
*.tmp
|
||||
*~
|
||||
.idea/
|
||||
.vscode/
|
113
README.md
Normal file
113
README.md
Normal file
|
@ -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!
|
401
install.sh
Executable file
401
install.sh
Executable file
|
@ -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
|
Loading…
Reference in New Issue
Block a user