
本文详解如何将 go 官方 present 工具(用于生成 html5 幻灯片)打包并部署到 heroku,无需自写 http 服务器,仅需正确配置 procfile 和构建环境即可实现一键上线。
Go 的 present 是一个轻量级、开箱即用的幻灯片服务工具,它能将 Markdown 格式的 .slide 文件实时渲染为响应式 HTML5 演示页面。虽然它本为本地开发演示设计,但通过合理封装,完全可以作为静态内容服务部署至 Heroku——关键在于:让 Heroku 正确识别、编译并运行 present 二进制程序,而非依赖源码构建。
✅ 正确部署步骤(推荐精简方案)
Heroku 不直接支持 Go 工具链内置命令(如 go install golang.org/x/tools/present),因此不建议在构建时动态安装 present。更可靠的方式是:预编译二进制 + 显式声明启动命令。
-
准备项目目录结构(与 go.mod 无关,纯静态部署):
my-present-app/ ├── Procfile ├── slides.slide # 你的主幻灯片文件(必须存在) ├── assets/ # (可选)图片、CSS、JS 等静态资源 └── present # 预编译好的 present 二进制(Linux AMD64,Heroku 运行环境)
-
获取兼容 Heroku 的 present 二进制
在本地 Linux 或 WSL 中执行(确保 GOOS=linux):GOOS=linux GOARCH=amd64 go install golang.org/x/tools/present@latest cp $(go env GOPATH)/bin/present . chmod +x present
⚠️ 注意:Heroku 运行于 Linux x86_64 环境,务必交叉编译;macOS/Windows 编译的二进制无法运行。
-
编写 Procfile(必需,无扩展名)
指定 Web 进程启动命令,并绑定到 Heroku 分配的端口:web: ./present -http :$PORT -base="/path/to/slides" -play=false
- $PORT 是 Heroku 动态注入的环境变量,必须使用;
- -base 指向幻灯片所在目录(若 slides.slide 与 present 同级,可省略或设为 .);
- -play=false 禁用 Go Playground(避免安全风险与构建失败)。
-
初始化 Git 并部署
git init git add . git commit -m "deploy present slides" heroku create --buildpack https://github.com/kr/heroku-buildpack-go.git git push heroku main # 或 master(依 Heroku CLI 版本而定)
? 补充说明与常见问题
- 无需 go.mod 或源码:此方案绕过 Go 构建流程,直接运行预编译二进制,因此项目根目录下不需要 go.mod 或任何 .go 源文件。
- 多幻灯片支持:将多个 .slide 文件放入同一目录,present 会自动聚合为导航菜单。
- 自定义域名与 HTTPS:部署成功后,可在 Heroku Dashboard 中添加自定义域名,并自动启用 Let’s Encrypt HTTPS。
- 资源路径注意:若幻灯片中引用了 assets/logo.png,确保该路径相对于 -base 目录有效,且文件已提交至 Git。
部署完成后,访问 https://your-app-name.herokuapp.com 即可在线浏览你的 HTML5 幻灯片——跨设备、免安装、即时更新,真正实现“一次编写,随处演示”。










