Расширение параметров командной строки с помощью 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
Проверьте модуль конфигурации Snap-сервера. В частности, extendedCommandLineConfig.
Вы могли бы использовать getEnv
, lookupEnv
или же getArgs
от System.Environment
Лично я бы пошел с подходом переменных ENV.