2

私の Makefile では、出力ディレクトリをハードコーディングするよりも環境変数で定義することを好みます (設定されていない場合は、妥当なデフォルト値を使用します)。たとえば、Make ルールは次のようになります。

$(OUTPUT_DIR)/some_file: deps
     #build commands

Shake で同様の目標を達成する方法はまだわかりません。環境変数の値または適切なデフォルト値を取得するために を使用するのが好きgetEnvWithDefaultですが、バインドやラムダでそれをバッシングしても、(*>).

で使用するために FilePattern で環境変数を補間するにはどうすればよいでしょ(*>)うか?

4

1 に答える 1

1

関数はモナドで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、そのリスクが排除されますが、通常は不要です。

于 2014-09-07T20:19:17.640 に答える