名称: 为Telegram机器人项目生成Makefile 描述: 为在macOS上运行的Telegram机器人项目生成一个生产就绪的Makefile,支持LaunchAgent后台服务管理。在设置新Telegram机器人项目或为现有项目添加服务管理时使用。
Telegram机器人Makefile
为在macOS上运行的Telegram机器人项目生成一个生产就绪的Makefile,支持LaunchAgent后台服务。
使用时机
- 设置新Telegram机器人项目
- 添加macOS LaunchAgent服务管理
- 需要快速启动/停止/重启机器人的命令
- 希望将机器人作为后台服务管理
生成的功能
快速开始
| 命令 | 描述 |
|---|---|
make setup |
首次设置(安装依赖、创建.env文件) |
make run |
在前台运行机器人 |
make dev |
使用自动重载运行(监视模式) |
后台服务(macOS LaunchAgent)
| 命令 | 描述 |
|---|---|
make start |
安装并启动后台服务 |
make stop |
停止后台服务 |
make restart |
重启后台服务 |
make status |
检查服务是否运行 |
make logs |
跟踪标准输出日志 |
make logs-err |
跟踪标准错误日志 |
make uninstall |
移除后台服务 |
开发
| 命令 | 描述 |
|---|---|
make install |
安装依赖 |
make test |
运行测试 |
make typecheck |
运行TypeScript类型检查 |
make clean |
移除临时文件和日志 |
要求
生成前,确保项目具备:
- LaunchAgent plist模板 位于
launchagent/com.{项目名称}.plist.template - 环境文件模板 位于
.env.example - Bun 作为运行时(或修改为npm/node)
步骤
步骤1:收集项目信息
询问用户:
- 项目名称(用于plist标签,例如
claude-telegram-ts) - 运行时命令(默认:
bun run src/index.ts) - 日志文件路径(默认:
/tmp/{项目名称}.log)
步骤2:生成Makefile
创建 Makefile,内容如下:
# {项目名称} - Makefile
# 用法:make <目标>
SHELL := /bin/bash
PLIST_NAME := com.{项目名称}
PLIST_PATH := ~/Library/LaunchAgents/$(PLIST_NAME).plist
PLIST_TEMPLATE := launchagent/$(PLIST_NAME).plist.template
LOG_FILE := /tmp/{项目名称}.log
ERR_FILE := /tmp/{项目名称}.err
.PHONY: help install setup run dev stop start restart status logs logs-err clean typecheck test uninstall
help:
@echo "{项目名称}"
@echo ""
@echo "快速开始:"
@echo " make setup - 首次设置(安装依赖、创建.env)"
@echo " make run - 在前台运行机器人"
@echo " make dev - 使用自动重载运行(监视模式)"
@echo ""
@echo "后台服务(macOS LaunchAgent):"
@echo " make start - 安装并启动后台服务"
@echo " make stop - 停止后台服务"
@echo " make restart - 重启后台服务"
@echo " make status - 检查服务是否运行"
@echo " make logs - 跟踪标准输出日志"
@echo " make logs-err - 跟踪标准错误日志"
@echo " make uninstall - 移除后台服务"
@echo ""
@echo "开发:"
@echo " make install - 安装依赖"
@echo " make test - 运行测试"
@echo " make typecheck - 运行TypeScript类型检查"
@echo " make clean - 移除临时文件和日志"
install:
bun install
setup: install
@if [ ! -f .env ]; then \
cp .env.example .env; \
echo "从模板创建.env"; \
echo ">>> 编辑.env以填入您的凭据"; \
else \
echo ".env已存在"; \
fi
run:
bun run start
dev:
bun run dev
test:
bun test
typecheck:
bun run typecheck
start:
@if [ ! -f .env ]; then \
echo "错误:未找到.env。请先运行'make setup'。"; \
exit 1; \
fi
@echo "安装LaunchAgent..."
@mkdir -p ~/Library/LaunchAgents
@export $$(grep -v '^#' .env | xargs) && \
sed -e "s|/Users/USERNAME/.bun/bin/bun|$$(command -v bun)|g" \
-e "s|/Users/USERNAME/Dev/{项目路径}|$$(pwd)|g" \
-e "s|USERNAME|$$(whoami)|g" \
-e "s|your-bot-token-here|$${TELEGRAM_BOT_TOKEN}|g" \
-e "s|<string>123456789</string>|<string>$${TELEGRAM_ALLOWED_USERS}</string>|g" \
$(PLIST_TEMPLATE) > $(PLIST_PATH)
@echo "从.env值创建$(PLIST_PATH)"
@launchctl unload $(PLIST_PATH) 2>/dev/null || true
@launchctl load $(PLIST_PATH)
@echo "服务已启动。请检查'make logs'获取输出。"
stop:
@launchctl unload $(PLIST_PATH) 2>/dev/null || echo "服务未运行"
@echo "服务已停止"
restart:
@launchctl kickstart -k gui/$$(id -u)/$(PLIST_NAME) 2>/dev/null || \
(echo "服务未加载。请先运行'make start'。" && exit 1)
@echo "服务已重启"
status:
@if launchctl list | grep -q $(PLIST_NAME); then \
echo "服务:运行中"; \
launchctl list $(PLIST_NAME); \
else \
echo "服务:未运行"; \
fi
uninstall: stop
@rm -f $(PLIST_PATH)
@echo "服务已卸载"
logs:
@if [ -f $(LOG_FILE) ]; then \
tail -f $(LOG_FILE); \
else \
echo "尚无日志文件。请先启动服务。"; \
fi
logs-err:
@if [ -f $(ERR_FILE) ]; then \
tail -f $(ERR_FILE); \
else \
echo "尚无错误日志。"; \
fi
clean:
rm -f $(LOG_FILE) $(ERR_FILE) 2>/dev/null || true
@echo "已清理临时文件"
步骤3:自定义sed替换
start目标需要匹配plist模板的sed模式。常见模式:
your-bot-token-here→${TELEGRAM_BOT_TOKEN}123456789→${TELEGRAM_ALLOWED_USERS}/Users/USERNAME→$(whoami)扩展路径- 为其他环境变量添加更多
-e "s|模式|替换|g"
步骤4:验证
make help
make setup
make run # 首先在前台测试
make start # 然后作为服务启动
make status
示例
输入: “为我的Telegram机器人项目创建Makefile”
输出: 生成完整Makefile,询问项目特定值(名称、路径),并根据plist模板自定义sed模式。