関数はモナドでgetEnvWithDefault
実行され、Action
モナドにアクセスできないコンテキストでルールの名前を指定する必要があるAction
ため、このパターンを試した方法で翻訳することはできません。いくつかの代替手段があります。
オプション 1:lookupEnv
電話をかける前に使用するshake
Make の動作と正確に一致させるには、次のように記述できます。
main = do
outputDir <- fromMaybe "output" <$> lookupEnv "OUTPUT_DIR"
shakeArgs shakeOptions $ do
(outputDir </> "some_file") *> \out -> do
need deps
-- build commands
ここでは、lookupEnv
関数 (from System.Environment
) を使用して、Shake の実行を開始する前に環境変数を取得します。次に、環境変数に正確に一致するファイルを定義できます。
オプション 2: ルールで出力を強制しない
some_file
または、どのディレクトリにあるかに関係なくビルドするルールを定義し、ビルドgetEnvWithDefault
するファイルを指定するときにtracked を使用することもできます。
main = shakeArgs shakeOptions $ do
"//some_file" *> \out -> do
need deps
-- build commands
action $ do
out <- getEnvWithDefault "OUTPUT_DIR"
need [out </> "some_file"]
ここで、ルール パターンは何でも構築でき、呼び出し元は出力がどうあるべきかを選択します。some_file
私はこのバリアントを好みますが、パターンが何らかの形で重複すると、名前が衝突する可能性があるという小さなリスクがあります。一意の名前を導入すると、すべての出力に名前が付けられ$OUTPUT_DIR/my_outputs/some_file
、そのリスクが排除されますが、通常は不要です。