Linux教程 / 第 170 节

第17章:日常开发工作流

整合所学知识,打造高效的日常开发工作流

本章目标

  • 掌握高效的日常开发命令组合
  • 学会使用tmux提升多任务效率
  • 能够快速排查和解决常见问题
  • 建立完整的开发到部署工作流
  • 形成良好的命令行使用习惯

17.1 高效终端环境

17.1.1 配置强大的Bash环境

# 编辑 ~/.bashrc
nano ~/.bashrc

添加实用配置:

# ========== 提示符美化 ==========
# 彩色提示符,显示Git分支
parse_git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}

export PS1="\[\e[32m\]\u@\h\[\e[m\]:\[\e[34m\]\w\[\e[m\]\[\e[33m\]\$(parse_git_branch)\[\e[m\]$ "

# ========== 历史记录优化 ==========
export HISTSIZE=10000
export HISTFILESIZE=20000
export HISTCONTROL=ignoredups:erasedups  # 忽略重复命令
shopt -s histappend  # 追加而非覆盖历史
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

# ========== 常用别名 ==========
# 导航
alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias ~='cd ~'
alias -- -='cd -'

# ls增强
alias ll='ls -lah --color=auto'
alias la='ls -A'
alias l='ls -CF'
alias lt='ls -lhtr'  # 按时间排序

# Git快捷方式
alias gs='git status'
alias ga='git add'
alias gc='git commit'
alias gp='git pull'
alias gps='git push'
alias gl='git log --oneline --graph --decorate --all'
alias gd='git diff'
alias gb='git branch'
alias gco='git checkout'

# Docker快捷方式
alias d='docker'
alias dc='docker-compose'
alias dps='docker ps'
alias dpa='docker ps -a'
alias di='docker images'
alias dex='docker exec -it'
alias dlogs='docker logs -f'

# 系统管理
alias update='sudo apt update && sudo apt upgrade -y'
alias install='sudo apt install'
alias remove='sudo apt remove'
alias search='apt search'

# 网络
alias myip='curl ifconfig.me'
alias ports='sudo netstat -tulpn'
alias listening='sudo lsof -iTCP -sTCP:LISTEN -n -P'

# 进程管理
alias psg='ps aux | grep -v grep | grep -i -e VSZ -e'
alias topcpu='ps aux --sort=-%cpu | head -10'
alias topmem='ps aux --sort=-%mem | head -10'

# 安全别名(防止误操作)
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# 快速编辑
alias bashrc='vim ~/.bashrc && source ~/.bashrc'
alias vimrc='vim ~/.vimrc'
alias hosts='sudo vim /etc/hosts'

# 快速服务管理
alias nginx-reload='sudo systemctl reload nginx'
alias nginx-restart='sudo systemctl restart nginx'
alias nginx-test='sudo nginx -t'

# ========== 实用函数 ==========
# 创建目录并进入
mkcd() {
    mkdir -p "$1" && cd "$1"
}

# 解压任何格式
extract() {
    if [ -f $1 ]; then
        case $1 in
            *.tar.bz2)   tar xjf $1     ;;
            *.tar.gz)    tar xzf $1     ;;
            *.bz2)       bunzip2 $1     ;;
            *.rar)       unrar e $1     ;;
            *.gz)        gunzip $1      ;;
            *.tar)       tar xf $1      ;;
            *.tbz2)      tar xjf $1     ;;
            *.tgz)       tar xzf $1     ;;
            *.zip)       unzip $1       ;;
            *.Z)         uncompress $1  ;;
            *.7z)        7z x $1        ;;
            *)           echo "'$1' cannot be extracted" ;;
        esac
    else
        echo "'$1' is not a valid file"
    fi
}

# 快速查找文件
ff() {
    find . -type f -name "*$1*"
}

# 快速查找目录
fd() {
    find . -type d -name "*$1*"
}

# 快速查找内容
fgrep() {
    grep -r "$1" .
}

# 查看进程占用的端口
port() {
    sudo lsof -i :$1
}

# 杀死占用端口的进程
killport() {
    sudo kill -9 $(sudo lsof -t -i:$1)
}

# 快速备份文件
backup() {
    cp "$1"{,.bak}
}

# Git快速提交
gitac() {
    git add .
    git commit -m "$1"
}

# Git快速推送
gitacp() {
    git add .
    git commit -m "$1"
    git push
}
# 重新加载配置
source ~/.bashrc

17.1.2 使用tmux多窗口管理

安装tmux:

sudo apt install tmux

基本使用:

# 启动tmux
tmux

# 创建命名会话
tmux new -s dev

# 列出会话
tmux ls

# 附加到会话
tmux attach -t dev

# 分离会话(在tmux中)
Ctrl+b d

# 杀死会话
tmux kill-session -t dev

常用快捷键 (前缀键 Ctrl+b):

# 窗格管理
Ctrl+b %    水平分割
Ctrl+b "    垂直分割
Ctrl+b 方向键  切换窗格
Ctrl+b x    关闭当前窗格
Ctrl+b z    最大化/恢复窗格

# 窗口管理
Ctrl+b c    创建新窗口
Ctrl+b n    下一个窗口
Ctrl+b p    上一个窗口
Ctrl+b 数字  切换到指定窗口
Ctrl+b ,    重命名窗口

# 会话管理
Ctrl+b d    分离会话
Ctrl+b s    列出会话
Ctrl+b $    重命名会话

tmux配置 (~/.tmux.conf):

# 修改前缀键为Ctrl+a
unbind C-b
set -g prefix C-a
bind C-a send-prefix

# 启用鼠标
set -g mouse on

# 窗格分割快捷键
bind | split-window -h
bind - split-window -v

# 快速重载配置
bind r source-file ~/.tmux.conf \; display "Config reloaded!"

# 窗格切换(vim风格)
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

# 状态栏美化
set -g status-bg black
set -g status-fg white
set -g status-left '#[fg=green]#S '
set -g status-right '#[fg=yellow]%Y-%m-%d %H:%M'

# 窗口索引从1开始
set -g base-index 1
setw -g pane-base-index 1

# 历史记录行数
set -g history-limit 10000

17.2 典型开发场景

17.2.1 场景1:启动新项目

#!/bin/bash
# start-project.sh - 快速启动项目环境

PROJECT_NAME=$1

if [ -z "$PROJECT_NAME" ]; then
    echo "Usage: $0 project-name"
    exit 1
fi

echo "Starting project: $PROJECT_NAME"

# 创建项目目录
mkdir -p ~/projects/$PROJECT_NAME
cd ~/projects/$PROJECT_NAME

# 初始化Git
git init
echo "node_modules/" > .gitignore
echo ".env" >> .gitignore
echo "*.log" >> .gitignore

# 创建README
cat > README.md <<EOF
# $PROJECT_NAME

## Description
Project description here

## Setup
\`\`\`bash
npm install
\`\`\`

## Development
\`\`\`bash
npm run dev
\`\`\`
EOF

# 初始化Node.js项目(如果需要)
read -p "Initialize Node.js project? (y/n) " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
    npm init -y
    npm install --save-dev nodemon
fi

# 打开编辑器
code .

echo "Project $PROJECT_NAME created successfully!"

17.2.2 场景2:日常开发流程

# 早上开始工作
cd ~/projects/my-app

# 1. 拉取最新代码
git pull origin main

# 2. 创建功能分支
git checkout -b feature/new-feature

# 3. 启动开发服务器(使用tmux)
tmux new -s dev

# 窗格1: 运行开发服务器
npm run dev

# Ctrl+b % (创建新窗格)
# 窗格2: 运行测试监视
npm run test:watch

# Ctrl+b " (创建新窗格)
# 窗格3: Git操作和命令行

# 4. 开发过程中频繁操作
gs                    # 查看状态
ga .                  # 添加修改
gc -m "feat: xxx"     # 提交
gp                    # 推送

# 5. 下班前
git push origin feature/new-feature
# 创建Pull Request
tmux detach  # 分离会话,明天继续

17.2.3 场景3:快速问题排查

# 应用无法访问,快速诊断

# 1. 检查应用是否运行
pm2 status
# 或
ps aux | grep node

# 2. 检查端口是否监听
sudo lsof -i :3000
sudo netstat -tulpn | grep :3000

# 3. 检查日志
pm2 logs my-app --lines 50
tail -f /var/log/myapp/error.log

# 4. 检查Nginx
sudo nginx -t
sudo systemctl status nginx
sudo tail -f /var/log/nginx/error.log

# 5. 检查系统资源
free -h
df -h
top

# 6. 检查网络
ping google.com
curl http://localhost:3000

# 7. 重启服务(如果需要)
pm2 restart my-app
sudo systemctl restart nginx

17.2.4 场景4:代码审查和测试

# 审查Pull Request

# 1. 拉取PR分支
git fetch origin pull/123/head:pr-123
git checkout pr-123

# 2. 安装依赖
npm install

# 3. 运行测试
npm test
npm run lint

# 4. 本地运行
npm run dev

# 5. 代码审查
git diff main...pr-123
git log main..pr-123

# 6. 合并(如果通过)
git checkout main
git merge pr-123
git push origin main

# 7. 清理
git branch -d pr-123

17.2.5 场景5:生产环境部署

# 部署到生产环境

# 1. SSH到服务器
ssh deploy@production-server

# 2. 进入应用目录
cd /home/deploy/my-app

# 3. 备份当前版本
cp -r . ../backup-$(date +%Y%m%d_%H%M%S)

# 4. 拉取最新代码
git fetch origin
git checkout main
git pull origin main

# 5. 安装依赖
npm install --production

# 6. 运行数据库迁移
npm run migrate

# 7. 构建(如果需要)
npm run build

# 8. 运行测试
npm test

# 9. 平滑重启
pm2 reload my-app

# 10. 健康检查
sleep 5
curl http://localhost:3000/health

# 11. 查看日志
pm2 logs my-app --lines 20

# 12. 监控
pm2 monit

17.3 实用工具脚本

17.3.1 项目切换脚本

#!/bin/bash
# proj.sh - 快速切换项目

PROJECTS_DIR=~/projects

# 列出所有项目
projects=($(ls -d $PROJECTS_DIR/*/))

# 显示菜单
echo "Select a project:"
select project in "${projects[@]}"; do
    if [ -n "$project" ]; then
        cd "$project"
        echo "Switched to: $project"
        
        # 如果有tmux会话,附加;否则创建
        session_name=$(basename "$project")
        if tmux has-session -t "$session_name" 2>/dev/null; then
            tmux attach -t "$session_name"
        else
            tmux new -s "$session_name"
        fi
        break
    fi
done

17.3.2 日志查看脚本

#!/bin/bash
# logs.sh - 统一日志查看

case $1 in
    app)
        pm2 logs my-app --lines ${2:-50}
        ;;
    nginx-access)
        sudo tail -n ${2:-50} /var/log/nginx/access.log
        ;;
    nginx-error)
        sudo tail -n ${2:-50} /var/log/nginx/error.log
        ;;
    system)
        sudo journalctl -n ${2:-50}
        ;;
    db)
        sudo tail -n ${2:-50} /var/log/mysql/error.log
        ;;
    *)
        echo "Usage: $0 {app|nginx-access|nginx-error|system|db} [lines]"
        exit 1
        ;;
esac

17.3.3 环境切换脚本

#!/bin/bash
# env-switch.sh - 切换开发环境

ENV=$1

case $ENV in
    dev)
        export NODE_ENV=development
        export API_URL=http://localhost:3000
        echo "Switched to DEVELOPMENT environment"
        ;;
    staging)
        export NODE_ENV=staging
        export API_URL=https://staging.example.com
        echo "Switched to STAGING environment"
        ;;
    prod)
        export NODE_ENV=production
        export API_URL=https://api.example.com
        echo "Switched to PRODUCTION environment"
        ;;
    *)
        echo "Usage: $0 {dev|staging|prod}"
        exit 1
        ;;
esac

# 显示当前环境变量
echo "NODE_ENV: $NODE_ENV"
echo "API_URL: $API_URL"

17.3.4 快速清理脚本

#!/bin/bash
# cleanup.sh - 清理开发环境

echo "====== Cleanup Started ======"

# 清理npm缓存
echo "Cleaning npm cache..."
npm cache clean --force

# 清理node_modules
echo "Removing node_modules..."
find . -name "node_modules" -type d -prune -exec rm -rf '{}' +

# 清理日志文件
echo "Cleaning log files..."
find . -name "*.log" -type f -delete

# 清理临时文件
echo "Cleaning temp files..."
rm -rf /tmp/*

# 清理Docker(可选)
read -p "Clean Docker? (y/n) " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
    docker system prune -af
fi

# 清理APT缓存
echo "Cleaning APT cache..."
sudo apt clean
sudo apt autoremove -y

echo "====== Cleanup Completed ======"

17.4 性能优化技巧

17.4.1 命令行性能优化

# 使用别名加速常用命令
alias g='git'
alias v='vim'
alias n='npm'

# 使用命令历史快速搜索
# Ctrl+R 反向搜索历史命令

# 使用!!重复上一条命令
sudo !!  # 以sudo执行上一条命令

# 使用!$引用上一条命令的最后一个参数
mkdir /path/to/dir
cd !$  # 等同于 cd /path/to/dir

# 使用Ctrl+U清空当前行
# 使用Ctrl+A跳到行首
# 使用Ctrl+E跳到行尾
# 使用Ctrl+W删除前一个单词

17.4.2 Git工作流优化

# 配置Git别名
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.unstage 'reset HEAD --'
git config --global alias.last 'log -1 HEAD'
git config --global alias.visual 'log --oneline --graph --decorate --all'

# 使用Git钩子自动化
# .git/hooks/pre-commit
#!/bin/bash
npm run lint
npm test

# 使用git stash临时保存修改
git stash
git checkout other-branch
# 做一些工作
git checkout original-branch
git stash pop

# 使用git worktree同时处理多个分支
git worktree add ../my-app-feature feature-branch
cd ../my-app-feature
# 在新目录中工作

17.5 团队协作最佳实践

17.5.1 代码提交规范

# 使用约定式提交(Conventional Commits)

# 格式: <type>(<scope>): <subject>

# 类型(type):
# feat: 新功能
# fix: 修复bug
# docs: 文档更新
# style: 代码格式(不影响代码运行)
# refactor: 重构
# test: 测试
# chore: 构建过程或辅助工具的变动

# 示例:
git commit -m "feat(auth): add login functionality"
git commit -m "fix(api): resolve CORS issue"
git commit -m "docs(readme): update installation steps"
git commit -m "refactor(utils): simplify date formatting"

17.5.2 分支管理策略

# Git Flow工作流

# 主分支
main        # 生产环境代码
develop     # 开发分支

# 辅助分支
feature/*   # 功能分支
hotfix/*    # 紧急修复
release/*   # 发布分支

# 开发新功能
git checkout develop
git checkout -b feature/new-feature
# 开发...
git checkout develop
git merge feature/new-feature
git branch -d feature/new-feature

# 发布
git checkout develop
git checkout -b release/v1.0.0
# 测试、修复bug...
git checkout main
git merge release/v1.0.0
git tag v1.0.0
git checkout develop
git merge release/v1.0.0
git branch -d release/v1.0.0

# 紧急修复
git checkout main
git checkout -b hotfix/critical-bug
# 修复...
git checkout main
git merge hotfix/critical-bug
git tag v1.0.1
git checkout develop
git merge hotfix/critical-bug
git branch -d hotfix/critical-bug

17.6 故障排查清单

17.6.1 应用无法启动

# 1. 检查端口占用
sudo lsof -i :3000
sudo netstat -tulpn | grep :3000

# 2. 检查环境变量
printenv | grep NODE_ENV
cat .env

# 3. 检查依赖
npm list
npm outdated

# 4. 检查日志
npm run dev 2>&1 | tee debug.log

# 5. 检查权限
ls -la
whoami

# 6. 检查磁盘空间
df -h

# 7. 检查内存
free -h

17.6.2 性能问题排查

# 1. CPU使用率高
top
ps aux --sort=-%cpu | head -10

# 2. 内存使用率高
free -h
ps aux --sort=-%mem | head -10

# 3. 磁盘IO高
sudo iotop
df -h

# 4. 网络问题
ping google.com
traceroute google.com
netstat -s

# 5. 数据库慢查询
# MySQL
sudo tail -f /var/log/mysql/slow-query.log

# 6. 应用性能分析
# Node.js
node --prof app.js
node --prof-process isolate-*.log

17.7 每日工作清单

17.7.1 早上开始工作

# 1. 检查系统状态
uptime
df -h
free -h

# 2. 拉取最新代码
cd ~/projects/my-app
git pull origin main

# 3. 检查依赖更新
npm outdated

# 4. 启动开发环境
tmux attach -t dev || tmux new -s dev

# 5. 查看今天的任务
# 使用GitHub Issues或Jira

17.7.2 开发过程中

# 频繁提交
git add .
git commit -m "feat: implement feature X"

# 定期推送
git push origin feature-branch

# 运行测试
npm test

# 代码检查
npm run lint

17.7.3 下班前

# 1. 提交所有修改
git status
git add .
git commit -m "wip: work in progress"
git push

# 2. 记录明天的TODO
echo "- Complete feature X" >> TODO.md
echo "- Fix bug Y" >> TODO.md

# 3. 备份重要文件
./backup.sh

# 4. 分离tmux会话
tmux detach

# 5. 关闭不需要的服务
pm2 stop dev-server

本章总结

核心工作流

  1. 环境配置

    • 优化Bash配置
    • 配置实用别名
    • 使用tmux管理会话
  2. 日常开发

    • Git版本控制
    • 代码提交规范
    • 分支管理策略
  3. 问题排查

    • 系统诊断
    • 日志分析
    • 性能优化
  4. 团队协作

    • 代码审查
    • 部署流程
    • 文档维护

效率提升技巧

  • ✅ 使用别名简化常用命令
  • ✅ 使用tmux管理多个任务
  • ✅ 编写自动化脚本
  • ✅ 建立标准化工作流
  • ✅ 定期备份和清理
  • ✅ 持续学习新工具

最佳实践

  • ✅ 频繁提交代码
  • ✅ 编写清晰的提交信息
  • ✅ 定期更新依赖
  • ✅ 保持代码整洁
  • ✅ 及时处理技术债务
  • ✅ 记录重要决策

练习题:

  1. 配置你的Bash环境,添加至少10个实用别名
  2. 使用tmux创建一个开发会话,包含3个窗格
  3. 编写一个项目初始化脚本
  4. 建立你自己的日常工作流清单

💡 提示: 高效的工作流是长期积累的结果,不断优化和改进你的开发环境!


🎉 恭喜完成教程!

你已经掌握了Linux开发者的核心技能:

  • ✅ 文件系统操作
  • ✅ 权限和用户管理
  • ✅ Git版本控制
  • ✅ 网络和文件传输
  • ✅ 环境配置
  • ✅ Shell脚本编程
  • ✅ Web项目部署
  • ✅ 日常工作流

下一步建议:

  1. 在实际项目中应用所学知识
  2. 深入学习感兴趣的领域
  3. 参与开源项目
  4. 持续学习新技术

继续学习资源:

  • Linux官方文档
  • Git Pro书籍
  • DevOps相关课程
  • 云服务提供商文档

祝你在Linux开发之路上越走越远! 🚀