当我构建我的snap项目时,它不包含我的任何静态资源或模板。
我的项目结构如下:
site.cabal
\src
\snaplets
\heist
*.tpl
\static
\css
*.css
\images
*.jpg
目前,我正在将我的二进制文件与我的静态文件(我只是复制过来)分开部署到服务器。
有一个更好的方法吗?任何帮助表示赞赏。
当我构建我的snap项目时,它不包含我的任何静态资源或模板。
我的项目结构如下:
site.cabal
\src
\snaplets
\heist
*.tpl
\static
\css
*.css
\images
*.jpg
目前,我正在将我的二进制文件与我的静态文件(我只是复制过来)分开部署到服务器。
有一个更好的方法吗?任何帮助表示赞赏。
您不能将静态文件嵌入到可执行文件中,同时仍然可以正常工作,因为它们应该 wrt 其余部分。
此外,在 Windows 中,PE 文件中有一个“资源系统”,可让您嵌入资源,但在 Linux/Unix 上则没有。因此,使用外部文件是确保它们在每个平台上都可访问的唯一可靠方法。
此外,您可能希望在用户上传静态文件时添加或删除它们,而这对于嵌入式资源是不可能的。
对于我最近的项目,我创建了一个名为 deploy.sh 的脚本,它看起来像这样:
#!/bin/sh
rf -fr ../myapp-deploy/*
cp -R dist/build/myapp/myapp log snaplets static ../myapp-deploy
然后我在 myapp-deploy 中部署所有内容。这可以通过多种方式完成。一种方法是将其压缩并通过 ftp/scp 将其发送到您的部署服务器。我喜欢并且过去使用过的另一种方法是将 myapp-deploy 放入它自己的 git 存储库中。然后在我运行 deploy.sh 之后,我提交 myapp-deploy 中的所有内容并将其推送到某个集中式存储库。然后在我的部署服务器上,我可以git pull && killall -HUP myapp
使用最新版本上线。将它放在 git 存储库中的好处是我总是可以很容易地恢复到以前的版本。如果您有用户创建的动态文件系统资源,那么这种方法可能不适合您。
归根结底,可靠的生产部署是一个复杂的问题,需要采用个性化的方法。像这样的东西可能是一个有用的指南,但不能取代对良好 IT 工程的需求。
您可以使用file-embedData.FileEmbed
中的found将静态文件嵌入到您的代码中。我创建一个目录并将所有静态的东西放在那里。然后使用以下代码访问它。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 查找和读取文件的方式,需要改用资源列表。