【问题标题】:Simple way to have the GHC API for application deployed on Windows在 Windows 上部署应用程序的 GHC API 的简单方法
【发布时间】:2011-03-18 17:47:34
【问题描述】:

我想在需要访问 GHC API 的 Windows 上部署一个应用程序。使用 Wiki 中的第一个简单示例:

http://www.haskell.org/haskellwiki/GHC/As_a_library

导致以下错误(在一台具有 haskell 平台的机器上编译并在另一个干净的 Windows 安装上执行): test.exe: 在 C:\haskell\lib\package.conf.d 找不到包数据库

我想将我的应用程序部署为一个简单的 zip 文件,并且不需要用户安装任何东西。有没有一种简单的方法可以将所需的 GHC 内容包含在该 zip 文件中以便它可以工作?

【问题讨论】:

  • 您可以手动指定package.conf.d 的路径,而不是调用libdir。即runGhc (Just "path\to\ghc\lib")
  • 谢谢,但我的问题更多是关于如何在 Windows 上的应用程序中实现 ghc 的最小嵌入,然后是提到的具体错误。
  • 在那种情况下,我不明白实际上是什么问题。看来您只需要将libmingw 复制到您的zip 并提供runGhc 与此lib 的相对路径(并且不要忘记从lib 中删除未使用的包和带有分析信息的库) )。
  • @max 请发表您的评论作为答案,以便我接受。这似乎就足够了。下一个挑战当然是以某种方式最小化 lib 目录,因为我的开发环境中的 lib 目录超过 682 MB。

标签: windows haskell deployment ghc-api


【解决方案1】:

此程序会将必要的文件复制到指定目录(仅适用于 windows):

import Data.List (isSuffixOf)
import System.Environment (getArgs)
import GHC.Paths (libdir)
import System.Directory
import System.FilePath 
import System.Cmd

main = do
  [to] <- getArgs
  let libdir' = to </> "lib"
  createDirectoryIfMissing True libdir'
  copy libdir libdir'
  rawSystem "xcopy"
    [ "/e", "/q"
    , dropFileName libdir </> "mingw"
    , to </> "mingw\\"]


-- | skip some files while copying
uselessFile f
  = or $ map (`isSuffixOf` f)
    [ "."
    , "_debug.a"
    , "_p.a", ".p_hi"    -- libraries built with profiling
    , ".dyn_hi", ".dll"] -- dynamic libraries


copy from to
  = getDirectoryContents from
  >>= mapM_ copy' . filter (not . uselessFile)
  where
    copy' f = do
      let (from', to') = (from </> f, to </> f)
      isDir <- doesDirectoryExist from'
      if isDir
          then createDirectory to' >> copy from' to'
          else copyFile from' to'

使用目标目录作为参数运行它后,您将拥有libmingw 的本地副本(总共约 300 Mb)。

您可以从lib 中删除未使用的库以节省更多空间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多