【问题标题】:Why does Yesod's TestImport module ignoreEnv in loadAppSettings?为什么Yesod的TestImport模块在loadAppSettings中会忽略Env?
【发布时间】: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? 暗示使用环境变量来配置数据库是合适的。测试模式不同吗?

【问题讨论】:

    标签: docker yesod


    【解决方案1】:

    担心的是开发人员用于开发的环境变量会运行测试套件并无意中使用这些环境变量,这可能会导致例如他们的开发数据库被意外擦除。 Michael Snoyman 在这里讨论这个问题:https://github.com/yesodweb/yesod-scaffold/issues/56

    由于两个人因此遇到了问题,也许需要不同的解决方案,或者在脚手架中关于测试环境默认不使用环境变量的注释会有所帮助?

    【讨论】:

    • 感谢 github 链接。如果测试运行程序打印了一条忽略环境的消息,并且可能还打印了它正在使用的设置,那会对我有所帮助。一个干净的方法来覆盖它会更好,但我不知道如何实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    • 2020-01-09
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多