Da sich so viele Menschen für die Frage interessieren, werde ich meinen aktuellen Ansatz hinzufügen, vielleicht findet ihn jemand nützlich. Der wahrscheinlich beste Weg wäre, wenn TH -D
Parameter in der Befehlszeile von GHC lesen darf , aber es scheint, dass derzeit nichts dergleichen implementiert ist.
Ein einfaches Modul ermöglicht es TH, die Umgebung zur Kompilierungszeit zu lesen. Eine Hilfsfunktion ermöglicht auch das Lesen von Dateien. Lesen Sie beispielsweise den Pfad einer Konfigurationsdatei aus der Umgebung und dann die Datei.
{-# LANGUAGE TemplateHaskell #-}
module THEnv
(
lookupCompileEnv
, lookupCompileEnvExp
, getCompileEnv
, getCompileEnvExp
, fileAsString
) where
import Control.Monad
import qualified Data.Text as T
import qualified Data.Text.IO as T
import Language.Haskell.TH
import Language.Haskell.TH.Syntax (Lift(..))
import System.Environment (getEnvironment)
lookupCompileEnv :: String -> Q (Maybe String)
lookupCompileEnv key = lookup key `liftM` runIO getEnvironment
lookupCompileEnvExp :: String -> Q Exp
lookupCompileEnvExp = (`sigE` [t| Maybe String |]) . lift <=< lookupCompileEnv
getCompileEnv :: String -> Q String
getCompileEnv key =
lookupCompileEnv key >>=
maybe (fail $ "Environment variable " ++ key ++ " not defined") return
getCompileEnvExp :: String -> Q Exp
getCompileEnvExp = lift <=< getCompileEnv
fileAsString :: FilePath -> Q Exp
fileAsString = do
stringE . T.unpack . T.strip <=< runIO . T.readFile
Es kann folgendermaßen verwendet werden:
{-# LANGUAGE TemplateHaskell #-}
import THEnv
main = print $( lookupCompileEnvExp "DEBUG" )
Dann:
runhaskell Main.hs
Drucke Nothing
;
DEBUG="yes" runhaskell Main.hs
druckt Just "yes"
.
addDependentFile
, um diese Datei bekannt zu machen,ghc --make
ist eine offensichtliche Alternative. Was sind die Probleme, die Sie mit dem aktuellen Schema haben?