4

当我构建我的snap项目时,它不包含我的任何静态资源或模板。

我的项目结构如下:

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

目前,我正在将我的二进制文件与我的静态文件(我只是复制过来)分开部署到服务器。

有一个更好的方法吗?任何帮助表示赞赏。

4

3 回答 3

2

您不能将静态文件嵌入到可执行文件中,同时仍然可以正常工作,因为它们应该 wrt 其余部分。

此外,在 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 中部署所有内容。这可以通过多种方式完成。一种方法是将其压缩并通过 ftp/scp 将其发送到您的部署服务器。我喜欢并且过去使用过的另一种方法是将 myapp-deploy 放入它自己的 git 存储库中。然后在我运行 deploy.sh 之后,我提交 myapp-deploy 中的所有内容并将其推送到某个集中式存储库。然后在我的部署服务器上,我可以git pull && killall -HUP myapp使用最新版本上线。将它放在 git 存储库中的好处是我总是可以很容易地恢复到以前的版本。如果您有用户创建的动态文件系统资源,那么这种方法可能不适合您。

归根结底,可靠的生产部署是一个复杂的问题,需要采用个性化的方法。像这样的东西可能是一个有用的指南,但不能取代对良好 IT 工程的需求。

于 2012-08-06T22:35:20.627 回答
0

您可以使用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 查找和读取文件的方式,需要改用资源列表。

于 2017-08-11T20:34:49.313 回答