私は現在、ビルド システムを make から Shake に移植するテストを行っており、障害にぶつかっています。
次のプロジェクト構造があるとします。
static/a.js
static/b.coffee
build/a.js
build/b.js
つまり、さまざまな入力拡張子が同一の出力拡張子にマップされるため、単純な"build//*.js" %>
ルールは機能しません。
可能な限り優先順位の使用を避けたかったので、可能な入力のいずれかの存在をチェックするアドホック ビルド ルールを作成するのは面倒だと感じたため (特に、この状況は他のファイル タイプでも発生するため)、次のように作成しました。
data StaticFileMapping a = StaticFileMapping String String (FilePath -> FilePath -> Action a)
staticInputs :: FilePath -> StaticFileMapping a -> Action [FilePath]
staticInputs dir (StaticFileMapping iExt _ _) = (findFiles (dir </> "static") [iExt])
staticInputToOutput :: StaticFileMapping a -> FilePath -> FilePath
staticInputToOutput (StaticFileMapping _ oExt _) = (remapDir ["build"]) . (-<.> oExt)
staticTargets :: FilePath -> StaticFileMapping a -> Action [FilePath]
staticTargets dir sfm = (map $ staticInputToOutput sfm) <$> staticInputs dir sfm
rules :: FilePath -> StaticFileMapping a -> Rules ()
rules dir sfm@(StaticFileMapping _ _ process) = join $ mconcat . (map buildInputRule) <$> staticInputs dir sfm
where buildInputRule :: FilePath -> Rules ()
buildInputRule input = (staticInputToOutput sfm input) %> (process input)
.coffee -> .js
そうすれば、各入力タイプ ( 、 ) などのマッピングを定義でき、.svg -> .png
それぞれの変換を実装するコードはほんのわずかです。そして、それはほとんど機能します。
しかし、私が知る限り、最初に値を捨てずにそこ(Action a)
から先に進むことは不可能に思えます。Rules _
Action
(Action a) -> (a -> Rules ()) -> Rules ()
タイプまたはの関数はあり(Action a) -> (Rules a)
ますか? どちらかを自分で実装できますか、それともライブラリのコードを変更する必要がありますか?
それとも、このアプローチ全体が頭がおかしいので、別のルートを取る必要がありますか?