Data.FileEmbed
find in file-embedを使用して、静的ファイルをコードに埋め込むことができます。ディレクトリを作成しres
、そこに静的なものをすべてドロップします。次に、次のコードを使用してアクセスします。
{-# LANGUAGE TemplateHaskell #-}
-- src/Resources.hs
module Resources ( getResource, listResources ) where
import qualified Data.ByteString as BS
import Data.FileEmbed
resources :: [(FilePath, BS.ByteString)]
resources = $(embedDir "res")
getResource :: FilePath -> Maybe BS.ByteString
getResource path = findResource resources
where
findResource [] = Nothing
findResource ((p,cont):xs) = if p == path
then (Just cont)
else findResource xs
listResources :: [FilePath]
listResources = map fst resources
次に、ルートを定義するコードで、次のリストを作成します(route, handlers)
。
-- src/Site.hs
resRoutes :: [(ByteString, Handler App App ())]
resRoutes = map f listResources
where
f res =
(TE.encodeUtf8 $ T.pack res, (writeBS . fromJust) $ getResource res)
-- in your SnapletInit
app = makeSnaplet "app" "" Nothing $ do
addRoutes resRoutes
addRoutes otherRoutes
return $ App ()
ファイルres/css/custom.css
システム内のファイルは、 経由でアクセスできますhttp://<site>/css/custom.css
。これは、テキスト ファイルと、画像などのバイナリ ファイルで機能します。
src/Resources.hs
静的ファイルはコンパイル中に「消費」されるため、リソースを追加、変更、または削除する場合は、そのファイルの再構築をトリガーする必要があることに注意してください。
Heist テンプレートを実行可能ファイルに組み込む方法をまだ探しています。似ているはずですが、Heist がファイルを検索して読み取る方法を変更するだけで、代わりにリソース リストを使用する必要があります。