4

スナッププロジェクトをビルドすると、静的リソースやテンプレートが含まれていません。

私のプロジェクト構造は次のとおりです。

site.cabal
\src
\snaplets
      \heist
           *.tpl
\static
       \css
           *.css
       \images
           *.jpg

現在、静的ファイル(単にコピーオーバー)とは別に、バイナリをサーバーにデプロイしています。

これを行うためのより良い方法はありますか?助けていただければ幸いです。

4

3 に答える 3

2

静的ファイルを実行可能ファイルに埋め込むことはできませんが、スナップの残りの部分で機能するはずです。

また、WindowsではPEファイルにリソースを埋め込むことができる「リソースシステム」がありますが、Linux/Unixではありません。したがって、外部ファイルを使用することが、すべてのプラットフォームで確実に到達可能にするための唯一の信頼できる方法です。

さらに、ユーザーが静的ファイルをアップロードする場合などに、静的ファイルを追加または削除したい場合がありますが、これは埋め込みリソースでは不可能です。

于 2012-08-06T09:31:44.677 に答える
2

最近のプロジェクトでは、次のようなdeploy.shというスクリプトを作成しました。

#!/bin/sh
rf -fr ../myapp-deploy/*
cp -R dist/build/myapp/myapp log snaplets static ../myapp-deploy

次に、myapp-deployにすべてをデプロイします。これはいくつかの方法で行うことができます。1つのアプローチは、それを圧縮して、デプロイメントサーバーにftp/scpすることです。私が気に入って過去に使用したもう1つのアプローチは、myapp-deployを独自のgitリポジトリに作成することです。次に、deploy.shを実行した後、myapp-deploy内のすべてをコミットし、それを一元化されたリポジトリにプッシュします。次に、デプロイメントサーバーgit pull && killall -HUP myappで、最新バージョンを使用して稼働させるために実行できます。gitリポジトリにあることの利点は、いつでも簡単に前のバージョンに戻すことができることです。ユーザーが動的なファイルシステムリソースを作成している場合、このアプローチはうまく機能しない可能性があります。

結局のところ、信頼性の高い本番展開は複雑な問題であり、個別のアプローチが必要です。このようなものは便利なガイドになる可能性がありますが、優れたITエンジニアリングの必要性に取って代わることはできません。

于 2012-08-06T22:35:20.627 に答える
0

Data.FileEmbedfind 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 がファイルを検索して読み取る方法を変更するだけで、代わりにリソース リストを使用する必要があります。

于 2017-08-11T20:34:49.313 に答える