【发布时间】:2015-11-09 00:14:42
【问题描述】:
我已经搭建了一个 Yesod 应用程序。创建的文件之一是 test/TestImport.hs。它包括以下sn-p:
withApp :: SpecWith App -> Spec
withApp = before $ do
settings <- loadAppSettings
["config/test-settings.yml", "config/settings.yml"]
[]
ignoreEnv
foundation <- makeFoundation settings
wipeDB foundation
return foundation
为什么它有ignoreEnv 参数? IE。为什么在测试模式下忽略环境是合适的?
从 Yesod 存储库中,我推断 TestImport.hs 是从适用于应用程序的数据库的 hs 文件生成的。就我而言,这是 Postgres 之一: https://github.com/yesodweb/yesod/blob/master/yesod-bin/hsfiles/postgres.hsfiles#L9172
ignoreEnv 本身的定义在这里:
https://github.com/yesodweb/yesod/blob/master/yesod/Yesod/Default/Config2.hs#L147
loadAppSettings runTimeFiles compileValues envUsage = do
...
value <-
case envUsage of
IgnoreEnv -> return $ applyEnvValue False mempty value'
UseEnv -> applyCurrentEnv False value'
RequireEnv -> applyCurrentEnv True value'
UseCustomEnv env -> return $ applyEnvValue False env value'
RequireCustomEnv env -> return $ applyEnvValue True env value'
出现这个问题是因为我在为 Yesod 和 Postgres 创建 Docker 容器后运行测试时遇到问题。 yesod init 生成的 config/settings.yml 中的 DB 配置与 Docker 测试 DB 不同。因为 TestImport.hs 忽略了环境,docker-compose run web yesod test 不起作用,因为它查找 localhost:5432 而不是 Docker IP 地址和转发的 DB 端口,无法连接到测试 DB。
如果我将 TestImport.hs 更改为 useEnv 而不是 ignoreEnv,它会起作用,但我想知道这是否是错误的解决方法。问题Can Yesod's DB be configured with environment variables? 暗示使用环境变量来配置数据库是合适的。测试模式不同吗?
【问题讨论】: