【问题标题】:How to run Go migrations on heroku on release?如何在发布时在 heroku 上运行 Go 迁移?
【发布时间】:2020-02-03 15:24:12
【问题描述】:

我正在用 Go 编写一个 webapp,它使用 Postgres 进行数据存储并部署在 Heroku 上。如何自动运行迁移?

我使用 Go 1.13,我想使用 Go Modules 进行依赖管理。

作为迁移工具,我尝试了这个https://github.com/golang-migrate/migrate。 在本地,我刚刚从 github 版本下载了最新的二进制文件并运行 CLI 实用程序 ./migrate -database $DATABASE_URL -path migrations up。

Heroku Procfile 内容

release: migrate -database $DATABASE_URL -path migrations up
web: bin/myawesomegoapp

当然,当我启动git push heroku master 时,我得到一个错误,即“迁移”没有这样的文件或目录,发布命令失败并推送被拒绝。

那么,我如何设置项目来安装migrate 命令以便能够在每个版本的heroku 上运行它?

【问题讨论】:

    标签: go heroku database-migration


    【解决方案1】:

    你必须告诉 Heroku 来构建它,这有点痛苦。以下是使用 go 模块实现它的方法。

    首先你必须告诉 go 模块包含它,即使它没有在源代码中引用。这是讨论here。这是我的工具包,位于我项目根目录的tools.go:

    // +build tools
    
    package tools
    
    // See this https://github.com/go-modules-by-example/index/blob/master/010_tools/README.md
    
    import (
        _ "github.com/golang-migrate/migrate/v4"
        _ "github.com/golang-migrate/migrate/v4/cmd/migrate"
    )
    

    然后我出售了我的依赖项。

    go mod tidy
    go mod vendor
    

    最后,你必须告诉 Heroku 为migrate 构建二进制文件,即not documented very thoroughly。为此,您不仅需要指定 migrate 所在的路径,还需要包含一个“.”。这告诉 heroku 你还想在工作目录中查找 main 包。这是因为(我猜)使用该指令会覆盖它们的默认包搜索行为。这是我的模块文件的样子:

    module ...
    
    // +heroku goVersion 1.14
    // +heroku install -tags 'postgres' ./vendor/github.com/golang-migrate/migrate/v4/cmd/migrate .
    
    go 1.14
    
    require (
    ...
    

    【讨论】:

    • 我按照你的例子,但我得到: -----> 运行: go install -v -tags heroku ./vendor/github.com/golang-migrate/migrate/v4/cmd /迁移。 stat /tmp/build_2038f68e/vendor/github.com/golang-migrate/migrate/v4/cmd/migrate:找不到目录。我有 vendor/golang-migrate/migrate/v4/cmd/migrate 文件夹,里面有 main.go
    猜你喜欢
    • 2015-09-21
    • 2020-06-10
    • 2012-10-27
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多