【问题标题】:Extending command line options with Haskell Snap使用 Haskell Snap 扩展命令行选项
【发布时间】:2014-04-04 02:18:29
【问题描述】:

我有一个酸性状态的后端来补充我的 snap 网站。它在自己的进程中运行,我的 snap web 服务器需要一个 IP 地址才能连接到它。出于调试和部署目的,我希望能够在运行已编译的 snap 应用程序时将 IP 地址作为命令行参数传递。这个 IP 地址可以在调用酸状态处理程序的 SnapletInit monad 中访问。

如何扩展 Snap 中的命令行参数系统来解决这个问题?

理想情况下,我想要类似的东西。

./app -ip 192.168.0.2 -p 8080 -e prod +RTS -I0 -A4M -qg1

然后像这样应用它。

app :: SnapletInit App App
app = makeSnaplet "app" "Snapplication" Nothing $ do
    ip <- getConfig "ip"
    d <- nestSnaplet "acid" acid $ acidInitRemote ip
    return $ App d

【问题讨论】:

    标签: haskell haskell-snap-framework


    【解决方案1】:

    我建议更改 Acid State snaplet 以从配置而不是命令行读取它的 IP。 Snap 中的配置已设置好,因此它会加载您在命令行上作为-e 参数传递的任何内容。例如,以-e prod 开头将加载snaplet/acidstate/prod.conf,不以-e-e devel 开头将加载snaplet/acidstate/devel.conf。这有助于将所有环境设置保持在一起,而不是允许任何可能的命令行标志组合。

    这是我的一个 snaplets 中的an example

    initStripe :: SnapletInit b StripeState
    initStripe = makeSnaplet "stripe" "Stripe credit card payment" Nothing $ do
      config <- getSnapletUserConfig
    
      (stripeState, errors) <- runWriterT $ do
        secretKey <- logErr "Must specify Strip secret key"  $ C.lookup config "secret_key"
        publicKey <- logErr "Must specify Strip public key"  $ C.lookup config "public_key"
        clientId  <- logErr "Must specify Strip client ID"   $ C.lookup config "client_id"
        version   <- Just . maybe V20110915d OtherVersion <$> liftIO (C.lookup config "version")
        let caFilePath = Just "" -- This is unused by Stripe but vestigial in the Haskell library.
    
        return $ StripeState <$> (StripeConfig <$> (SecretKey <$> secretKey) <*> caFilePath <*> version) <*> (PublicKey <$> publicKey) <*> clientId
      return $ fromMaybe (error $ intercalate "\n" errors) stripeState
    

    【讨论】:

      【解决方案2】:

      【讨论】:

      • 你能详细说明一下吗?这些文档似乎是专门为已经了解 snap 内部结构的人编写的。我不知道如何使用该函数,或者如何使用调用它的更高级别的 commandLineAppConfig。
      • extendedCommandLineConfigSource 的第一个参数是您自己的自定义命令行选项的列表。第二个参数是这些选项的组合函数。
      • 这就是 API 文档所说的。这并不清楚人们应该如何使用它。创建自定义命令行选项列表很好,但是将它们传递给 extendedCommandLineConfigSource 会删除内置选项,如果您手动添加回内置选项,则仍然缺少 -e,因为它需要是配置快照AppConfig,你如何处理多个命令行选项? AppConfig 只是一个 Maybe 字符串?
      • 您需要使用自己的数据类型而不是 AppConfig。然后,您还需要在其中包含 -e 以及您需要的任何其他信息,以便您可以像现在一样设置它。
      【解决方案3】:

      您可以使用来自System.EnvironmentgetEnvlookupEnvgetArgs

      就我个人而言,我会采用 ENV 变量方法。

      【讨论】:

      • 是的,可以使用ip &lt;- fromMaybe "localhost" &lt;$&gt; lookupEnv "ACIDIP"。有时我想在本地端口 80 上运行 Web 服务器进行测试,但未考虑 env 变量。所以我使用sudo visudoDefaults env_keep += "ACIDIP"重新导出它
      • 唯一的问题是我仍然无法在不更改环境变量的情况下热交换 IP 地址
      • 下次您应该在问题中包含所有要求。您可以触发site reload 来重新加载 snaplet,或者创建一个 snap 路由来进行重新加载,或者创建您自己的 snaplet 来更改这些内容。运行snap init 将为您提供一些用于重新加载的示例代码。此外,您可以在命令行myenv="this" mySnapProject 上设置 ENV 变量
      • 哇,不知道你能做到myenv="this" mySnapProject谢谢。
      猜你喜欢
      • 2011-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多