如何在 Heroku 上部署 Go 的 present 演示服务

10次阅读

如何在 Heroku 上部署 Go 的 present 演示服务

本文详解如何将 go 官方 present 工具(用于生成 html5 幻灯片)打包并部署到 heroku,无需自写 http 服务器,仅需正确配置 procfile 和构建环境即可实现一键上线。

go 的 present 是一个轻量级、开箱即用的幻灯片服务工具,它能将 markdown 格式的 .slide 文件实时渲染为响应式 html5 演示页面。虽然它本为本地开发演示设计,但通过合理封装,完全可以作为静态内容服务部署至 Heroku——关键在于:让 Heroku 正确识别、编译并运行 present 二进制程序,而非依赖源码构建。

✅ 正确部署步骤(推荐精简方案)

Heroku 不直接支持 Go 工具链内置命令(如 go install golang.org/x/tools/present),因此不建议在构建时动态安装 present。更可靠的方式是:预编译二进制 + 显式声明启动命令

  1. 准备项目目录结构(与 go.mod 无关,纯静态部署):

    my-present-app/ ├── Procfile ├── slides.slide     # 你的主幻灯片文件(必须存在) ├── assets/          # (可选)图片、cssjs 等静态资源 └── present          # 预编译好的 present 二进制(linux AMD64,Heroku 运行环境)
  2. 获取兼容 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 编译的二进制无法运行。

  3. 编写 Procfile(必需,无扩展名)
    指定 Web 进程启动命令,并绑定到 Heroku 分配的端口:

    web: ./present -http :$PORT -base="/path/to/slides" -play=false
  • $PORT 是 Heroku 动态注入的环境变量,必须使用
  • -base 指向幻灯片所在目录(若 slides.slide 与 present 同级,可省略或设为 .);
  • -play=false 禁用 Go Playground(避免安全风险与构建失败)。
  1. 初始化 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 幻灯片——跨设备、免安装、即时更新,真正实现“一次编写,随处演示”。

text=ZqhQzanResources