Расширение параметров командной строки с помощью Haskell Snap

У меня есть кислотный штат, который дополняет мой сайт Snap. Он работает в своем собственном процессе, и моему мгновенному веб-серверу требуется IP-адрес для подключения к нему. В целях отладки и развертывания я хотел бы иметь возможность передавать IP-адрес в качестве аргумента командной строки при запуске моего скомпилированного приложения моментальных снимков. Этот IP-адрес будет доступен внутри SnapletInit монада, где вызывается обработчик кислотного состояния.

Как расширить систему параметров командной строки в 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

3 ответа

Решение

Я бы порекомендовал изменить моментальный снимок Acid State, чтобы он считывал его IP из конфигурации, а не из командной строки. Конфиги в Snap настроены так, что он загружает все, что вы передаете, как -e аргумент в командной строке. Например, начиная с -e prod будет загружать snaplet/acidstate/prod.conf и начиная с нет -e или же -e devel будет загружать snaplet/acidstate/devel.conf, Это помогает сохранить все настройки среды вместе, а не разрешать любую возможную комбинацию флагов командной строки.

Вот пример из одного из моих снимков:

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

Вы могли бы использовать getEnv, lookupEnv или же getArgs от System.Environment

Лично я бы пошел с подходом переменных ENV.

Другие вопросы по тегам