下面的文字仅仅是备份
使用 minghc 在 windows 开发 yesod 项目的笔记
系统环境
Windows 8 64bit English
备注(winxp32位经过测试不成功,请勿尝试)
安装开发环境
安装各种软件以尽量减少对系统的影响为原则。例如不修改系统环境变量、注册表之类。
minghc
下载运行安装程序
安装完成
基本使用
打开 windows 的命令窗口,运行以下命令
d:\minghc-7.8.4-x86_64\switch\minghc-7.8
这是个 bat,会设置好 PATH 环境变量。
然后就可以在这个命令行窗口开始工作了。
cabal update
如果全新安装,或很久没做过 cabal update,那就现在做一次。
运气不好的话,这一步有时候很慢,可以用环境变量指定 proxy
安装 yesod 相关工具
安装 yesod-bin
找个临时目录,执行
cabal get yesod-bin
d:\tmp>cabal get yesod-bin
Downloading yesod-bin-1.4.11…
Unpacking to yesod-bin-1.4.11\
进入已解包的目录,执行例行的 cabal sandbox install 步骤
cabal sandbox init
cabal install –dependencies-only
cabal install
install 之后,会在 .cabal-sandbox\bin 目录下生成多个 exe 文件,只需把这些文件 copy 至方便的目录即可。考虑到 minghc 已设置好的 PATH ,大概放在 minghc 安装目录下的 bin 目录是个好的选择。
最后,丢弃这个目录 d:\tmp\yesod-bin-1.4.11,不要再在这个目录下工作了
构建一个最简单的使用 MySQL 的 Yesod 项目
因为用 cabal sandbox,故以下过程,基本上可以理解为每次新项目都要做一次(除非与sandbox无关的操作)。
安装 MySQL Connector/C
这就是一个C库。与 sandbox 无关,做一次就可以了。
下载页面
http://dev.mysql.com/downloads/connector/c/
下载连接
http://dev.mysql.com/get/Downloads/Connector-C/mysql-connector-c-6.1.6-winx64.zip
找个合适的目录解开即可。
生成代码
如果是新的项目,应使用 yesod.exe 生成模板代码。
在命令行窗口内,找个合适的目录,执行 yesod init 按提示操作。
下面红色字是我的输入,其它是命令的提示文字。
d:\tmp>yesod init
Welcome to the Yesod scaffolder.
I’m going to be creating a skeleton Yesod project for you.
What do you want to call your project? We’ll use this for the cabal name.
Project name: mysql-site
Yesod uses Persistent for its (you guessed it) persistence layer.
This tool will build in either SQLite or PostgreSQL or MongoDB support for you.
We recommend starting with SQLite: it has no dependencies.
s = sqlite
p = postgresql
pf = postgresql + Fay (experimental)
mongo = mongodb
mysql = MySQL
simple = no database, no auth
mini = bare bones, the "Hello World" of multi-file Yesod apps
(Note: not configured to work with yesod devel)
url = Let me specify URL containing a site (advanced)
So, what’ll it be? mysql
That’s it! I’m creating your files now…
___
{-) |\
[m,].-"-. /
[][__][__] \(/\__/\)/
[__][__][__][__]~~~~ | |
[][__][__][__][__][] / |
[__][__][__][__][__]| /| |
[][__][__][__][__][]| || | ~~~~
ejm [][][][][],_, _/
The foundation for your web application has been built.
There are a lot of resources to help you use Yesod.
Start with the book: http://www.yesodweb.com/book
Take part in the community: http://yesodweb.com/page/community
It’s highly recommended to follow the quick start guide for
installing Yesod: http://www.yesodweb.com/page/quickstart
If your system is already configured correctly, please run:
cd mysql-site && cabal install -j –enable-tests –max-backjumps=-1 –reorder
-goals && yesod devel
安装依赖的库
然后进入新建出来的 mysql-site 目录。(这目录名就是你输入的项目名,但你可以生成之后随便改。)做一次 cabal sandbox init
d:\tmp\mysql-site>cabal sandbox init
Writing a default package environment file to
d:\tmp\mysql-site\cabal.sandbox.config
Creating a new sandbox at D:\tmp\mysql-site.cabal-sandbox
然后又是 cabal install –dependencies-only。这过程也会有点长,因为会安装许多库。而且会以失败结束,因为 mysql 相关的 haskell 库安装会失败,但大部分库还是会成功安装到 sandbox 去的。(如果生成代码时选择的是 postgresql ,也会出类似的错误。选择 sqlite 则应该可以直接完全安装成功。)
如果看到的不是跟数据库相关的库安装也失败了,看看是不是暂时性的网络错误引起的。比如,我测试时就见过 getAddrInfo 错误,这看上去就是 DNS 解释错误而已。
这类问题的解决方法就是多执行几次 cabal install –dependencies-only
最后,不能安装的 haskell 库应该是以下几个:
pcre-light
mysql-simple
mysql
persistent-mysql
这些库都是直接或间接因为依赖 MySQL 引起的。这里真正有问题的库只是其中两个
pcre-light
mysql
下面试试能不能解决这几个问题
———————– 以下未成功---------
pcre-light 的安装
先要解决 pcre-light
pcre-light 安装不了原因是找不到 pcre 的头文件和C库文件。
解决方法就两个思路:找现成的,或直接从源代码build出来。
找现成
按千人提供的stackoverflow 答案做
从源代码 build
这方法以前做过,记得是可以的。但现在有现成的,就不自己build了。
mysql 的安装
注意:mysql 库用下面的方法能 build 成功,开发用是可以的,但产品用就太危险了,因为下面修改去掉了部分线程、signal 相关的操作,实际使用会有什么影响并不了解。
我们要修改代码,因此先把代码取出来。
d:\tmp\mysql-site>cd ..
d:\tmp>cabal get mysql
Unpacking to mysql-0.1.1.8\
d:\tmp>cd mysql-0.1.1.8
d:\tmp\mysql-0.1.1.8>cabal sandbox init –sandbox=..\mysql-site.cabal-sandbox
Writing a default package environment file to
d:\tmp\mysql-0.1.1.8\cabal.sandbox.config
Using an existing sandbox located at D:\tmp\mysql-site.cabal-sandbox
注意:我在 init sandbox 时指定了前面生成的 sandbox 的路径。因为最终我们是要把这个库安装到前面那个 sandbox 去的。这是多个相关项目共享一个 cabal sandbox 的方法。
现在如果执行 cabal install 错误提示应该是这样的
d:\tmp\mysql-0.1.1.8>cabal install
Resolving dependencies…
[1 of 1] Compiling Main ( dist\dist-sandbox-835f98c1\setup\setup.hs, dist\dist-sandbox-835f98c1\setup\Main.o )
Linking .\dist/dist-sandbox-835f98c1\setup\setup.exe …
Configuring mysql-0.1.1.8…
setup.exe: The program ‘mysql_config’ is required but it could not be found
Failed to install mysql-0.1.1.8
cabal: Error: some packages failed to install:
mysql-0.1.1.8 failed during the configure step. The exception was:
ExitFailure 1
对代码作如下修改
文件 Database/MySQL/Base/C.hsc: 增加
#include <windows.h>
所有 foreign import ccall ..
,把 ccall 改成 stdcall。
另一个 hsc 文件也要增加 windows.h。
cbits/mysql_signals.c: 去掉所有跟 pthread 有关的函数调用:就是让两个 macro 变成空操作,init_rts_sigset函数整个去掉。
最后是 Setup.lhs
把以下两行
include <- mysqlConfig [“–include”]
libs <- mysqlConfig [“–libs”]
改成:
let include = [ “-IC:\Progra~2\MySQL\MySQLC~1.1\include” ]
let libs = [ “-LC:\Progra~2\MySQL\MySQLC~1.1\lib”, “-llibmysql”]
当然,具体路径看 connector 所在目录而定。
现在 cabal install 就可以成功安装了。
现在回到之前生成的项目mysql-site的目录,再执行一次
cabal install –dependencies-only
这次应该完全没错误了
现在就可以执行
yesod devel