環境変数を使用する既存のアプローチは機能するはずです。環境変数は Shake によって既に追跡されているため、1 つのアプローチはDEBUG=YES
それを解析して環境変数に変換することです。例えば:
main = shakeArgsWith shakeOptions [] $ \_ args -> do
let (vars,files) = partition ('=' `elem`) args
forM_ vars $ \v -> let (a,'=':b) = break (== '=') v in setEnv a b
return $ Just $ if null files then rules else want files >> withoutActions rules
rules :: Rules ()
rules = ...
環境変数はプロセス (およびその子プロセス) に対してローカルであるため、これはおそらく問題なく機能します。
もちろん、そのような情報を環境変数に保存するのは少し面倒です。代わりに、独自のオラクルを作成して情報を保存できます。
main = shakeArgsWith shakeOptions [] $ \_ args -> do
let (vars,files) = partition ('=' `elem`) args
let vars2 = [(a,b) | v <- vars, let (a,'=':b) = break (== '=') v]
return $ Just $ do
global <- addOracle $ \(Global x) -> return $ lookup x vars2
if null files then rules global else want files >> withoutActions (rules global)
newtype Global = Global String deriving (Show,Typeable,Eq,Hashable,Binary,NFData)
rules :: (Global -> Action (Maybe String)) -> Rules ()
rules global = undefined
ここで、 を使用して環境変数に情報を書き込む代わりに、setEnv
を使用してオラクルに情報を保存しaddOracle
ます。これは引き続き追跡され、他の環境変数と競合することはありません。