2012-11-15 23 views
3

(我的问题是有关分发二进制程序不哈斯克尔平台,GHC,小集团,...)最小哈斯克尔(GHC)程序安装(部署,而无需GHC /小集团)

我需要部署一个良好的阴谋形成哈斯克尔应用(一个Yesod脚手架),但我有磁盘空间限制。

GHC大小约为1Gbytes,存储所有阴谋的源代码,包等...需要更多的磁盘空间,等等

显然,哈斯克尔平台,GHC,......是关于发展(不部署)。

在我的特定情况下,我可以生成

cabal clean && cabal configure && cabal build 

,并成功地运行(有些像)

./dist/build/MyEntryPoint/MyEntryPoint arg arg arg 

但是,这个依赖?如何将其移动到生产环境? (我的“dist”汇编)

我可以把没有cabal的二进制依赖吗?怎么样?

非常感谢!

+0

请参阅:[GHC编译的二进制文件是否需要GHC或者它们是独立的?](http://stackoverflow.com/questions/6389948/do-ghc-compiled-binaries-require-ghc-or-are-他们自包含) – hammar

+0

你认为只检查它将运行的ldd依赖关系吗?我会尽力! :) – josejuan

+0

另请参阅有关二进制大小的说明:http://stackoverflow.com/questions/6115459/small-haskell-program-compiled-with-ghc-into-huge-binary –

回答

7

默认情况下,ghc使用Haskell库的静态链接。所以生成的二进制文件独立于Haskell生态系统。如果你的程序不需要任何数据文件,刚刚走出从./dist/build/MyEntryPoint/MyEntryPoint复制二进制到主机

如果您也有通过使用数据路径的二进制引用的数据文件(例如模板,图片,静态的HTML页面)发现惊天动地的逻辑,你可以使用Setup copy如下(使用快乐为例):

 
/tmp/happy-1.18.10 $ ./Setup configure 
Warning: defaultUserHooks in Setup script is deprecated. 
Configuring happy-1.18.10... 
/tmp/happy-1.18.10 $ ./Setup build 
Building happy-1.18.10... 
Preprocessing executable 'happy' for happy-1.18.10... 
[ 1 of 18] Compiling NameSet   (src/NameSet.hs, dist/build/happy/happy-tmp/NameSet.o) 
[..] 
[18 of 18] Compiling Main    (src/Main.lhs, dist/build/happy/happy-tmp/Main.o) 
Linking dist/build/happy/happy ... 
/tmp/happy-1.18.10 $ ./Setup copy --destdir=/tmp/to_be_deployed/ 
Installing executable(s) in /tmp/to_be_deployed/usr/local/bin 
/tmp/happy-1.18.10 $ find /tmp/to_be_deployed 
/tmp/to_be_deployed 
/tmp/to_be_deployed/usr 
/tmp/to_be_deployed/usr/local 
/tmp/to_be_deployed/usr/local/bin 
/tmp/to_be_deployed/usr/local/bin/happy 
/tmp/to_be_deployed/usr/local/share 
/tmp/to_be_deployed/usr/local/share/doc 
/tmp/to_be_deployed/usr/local/share/doc/happy-1.18.10 
/tmp/to_be_deployed/usr/local/share/doc/happy-1.18.10/LICENSE 
/tmp/to_be_deployed/usr/local/share/happy-1.18.10 
/tmp/to_be_deployed/usr/local/share/happy-1.18.10/GLR_Lib-ghc-debug 
/tmp/to_be_deployed/usr/local/share/happy-1.18.10/GLR_Lib-ghc 
/tmp/to_be_deployed/usr/local/share/happy-1.18.10/GLR_Lib 
/tmp/to_be_deployed/usr/local/share/happy-1.18.10/GLR_Base 
/tmp/to_be_deployed/usr/local/share/happy-1.18.10/HappyTemplate-arrays-coerce-debug 
/tmp/to_be_deployed/usr/local/share/happy-1.18.10/HappyTemplate-arrays-ghc-debug 
/tmp/to_be_deployed/usr/local/share/happy-1.18.10/HappyTemplate-arrays-debug 
/tmp/to_be_deployed/usr/local/share/happy-1.18.10/HappyTemplate-arrays-coerce 
/tmp/to_be_deployed/usr/local/share/happy-1.18.10/HappyTemplate-arrays-ghc 
/tmp/to_be_deployed/usr/local/share/happy-1.18.10/HappyTemplate-arrays 
/tmp/to_be_deployed/usr/local/share/happy-1.18.10/HappyTemplate-coerce 
/tmp/to_be_deployed/usr/local/share/happy-1.18.10/HappyTemplate-ghc 
/tmp/to_be_deployed/usr/local/share/happy-1.18.10/HappyTemplate 
/tmp/happy-1.18.10 $ rsync -rva /tmp/to_be_deployed/ production.host:/ 
[..] 

如果你不想安装到/usr/local然后传递所需的前缀Setup configure

如果目标主机在其他方面类似(安装了相同版本的C库(如gmp和ffi)),则此方法运行良好。如果您还需要静态链接某个C库,请参阅hammar在其评论中链接的question

+0

“生成的二进制文件独立于Haskell生态系统”谢谢!我会试试看! – josejuan

+0

你是对的Joachim,它是直接运行。再次感谢你! – josejuan