为什么 Yesod 的 TestImport 模块会在 loadAppSettings 中忽略 Env?
Why does Yesod's TestImport module ignoreEnv in loadAppSettings?
我搭建了一个 Yesod 应用程序。创建的文件之一是 test/TestImport.hs。它包括以下代码段:
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 是从适用于应用程序所用数据库的 hsfiles 生成的。就我而言,这是 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 容器后遇到 运行 测试问题。 config/settings.yml 中由 yesod init
生成的数据库配置与 Docker 测试数据库不同。因为 TestImport.hs 忽略了环境,所以 docker-compose run web yesod test
不起作用,因为它寻找 localhost:5432 而不是 Docker IP 地址和转发的 DB 端口,无法连接到测试数据库。
如果我将 TestImport.hs 改为 useEnv
而不是 ignoreEnv
,它会起作用,但我想知道这是否是错误的解决方法。问题 Can Yesod's DB be configured with environment variables? 暗示使用环境变量配置数据库是合适的。测试模式是否不同?
担心的是开发人员的开发环境变量会 运行 测试套件并无意中使用这些环境变量,这可能会导致例如他们的开发数据库被意外擦除。 Michael Snoyman 在这里讨论:https://github.com/yesodweb/yesod-scaffold/issues/56
由于两个人因此 运行 陷入问题,也许需要不同的解决方案,或者在脚手架中评论关于默认情况下不使用环境变量的测试环境会有帮助?
我搭建了一个 Yesod 应用程序。创建的文件之一是 test/TestImport.hs。它包括以下代码段:
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 是从适用于应用程序所用数据库的 hsfiles 生成的。就我而言,这是 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 容器后遇到 运行 测试问题。 config/settings.yml 中由 yesod init
生成的数据库配置与 Docker 测试数据库不同。因为 TestImport.hs 忽略了环境,所以 docker-compose run web yesod test
不起作用,因为它寻找 localhost:5432 而不是 Docker IP 地址和转发的 DB 端口,无法连接到测试数据库。
如果我将 TestImport.hs 改为 useEnv
而不是 ignoreEnv
,它会起作用,但我想知道这是否是错误的解决方法。问题 Can Yesod's DB be configured with environment variables? 暗示使用环境变量配置数据库是合适的。测试模式是否不同?
担心的是开发人员的开发环境变量会 运行 测试套件并无意中使用这些环境变量,这可能会导致例如他们的开发数据库被意外擦除。 Michael Snoyman 在这里讨论:https://github.com/yesodweb/yesod-scaffold/issues/56
由于两个人因此 运行 陷入问题,也许需要不同的解决方案,或者在脚手架中评论关于默认情况下不使用环境变量的测试环境会有帮助?