因为最近在上一个移动互联网项目,但是对于外包公司的PHP所采用的ZF(2.0.5)框架的效率觉得真的无法忍受,所以想着以后的接口采用自己熟悉的 ASP.NET 框架来写,
也因此,就有这一篇文章;
参考文档: http://www.bgsoftfactory.net/run-asp-net-mvc-4-with-mysql-on-linux/
步骤:
sudo su -- 切换到管理员模式
apt-get update -- 升级已经安装的软件包到最新版本
apt-get dis-upgrade --升级版本到最新(主要升级内核到最新)
apt-get install build-essential git autoconf libtool automake unzip --安装必要的软件包;
mkdir ~/monobuild
cd ~/monobuild -- 在 home 目录下建立 monobuild 目录;
下载 libgdipls 最新版本并解药到 libgdiplus 目录
wget https://github.com/mono/libgdiplus/archive/master.zip
mv master.zip libgdiplus.zip
unzip libgdiplus.zip
mv libgdiplusmaster libgdiplus
--继续安装 编译 libgdiplus 必要的包;
apt-get install libglib2.0-dev libjpeg-dev libtiff4-dev libpng12-dev libgif-dev libexif-dev libx11-dev libxrender-dev libfreetype6-dev libfontconfig1-dev gettext libcairo2-dev
cd libgdipls
./autogen --prefix=/usr
make
make install -- 如果,你看到 Libraries have been installed in: /usr/lib 之类的字样,表示 libgdiplus 成功编译并复制到 /usr/lib 目录;
cd ~/monobuild --回到主目录准备安装 mono;
wget https://github.com/mono/mono/archive/master.zip --下载 mono 的最新版本;不过这个步骤看你的网络速度,我单位的测试服务器很快,云主机就慢的一笔;
安装编译所需要的软件包(根据 http://www.mono-project.com/docs/compiling-mono/linux/ 这个网页,基于 debian 的 linux需要安装这些软件包) ,
这个貌似会把 mono 的开发包给装到 /usr/bin 目录下,
sudo apt-get install git autoconf libtool automake build-essential mono-devel gettext这个时候运行 mono -V ,应该会提醒你 mono安装的是 3.2.8;which mono 你可以看到 mono 命令位于 /usr/bin 目录下;
mv master.zip mono.zip
unzip mono.zip
mv monomaster mono
cd mono
./autogen.sh --prefix=/usr -- 产生 make 文件,根据上面 which 的结果, 我们需要指定 prefix=/usr 以便 我们新编译的 mono 能够覆盖旧的 mono 版本;
make -- 这一步就看你的机器了,不过可以负责任的说一句,快不le;
make install -- 好了,如果没有错误,mono 这个时候应该已经安装到了 /usr/bin 目录,替换了之前 mono-devel 软件包安装的版本;
现在你可以试试看看
mono -V 是什么版本; 这个时候应该是 4.2.0.027 ; (当然,你下载的时候可能已经是另外一个更新的版本了);
2. 编译 mono 的时候,根据 mono 的install 说明,在你 make 之前,
如果你没有一个可以工作的mono安装环境,你需要下载一个小小的 mono 编译器;l
简单运行如下命令即可以在你的本机安装一个 足够编译 mono 源代码的 mono编译器;
简单来说,就是在 编译 mono 最新的源代码的时候,你需要一个mono编译器
( 如果你能够理解用 c编译器 来对 C编译器源代码 进行编译产生一个新的 C编译器的话,理解这句话应该不难)
make get-monolite-latest
3. mono的安装,配置根据 git 上 mono 的说法,建议你指定 --prefix=/usr, 参考文档中写的是 /usr/local ,
参考文档中说的应该是有问题的,因为死活说找不到 gmcs, 但指定 --prefix=/usr 就没有问题;
注意,make 之前先运行 下面的指令;
make get-monolite-latest
对 mono 进行 make 的时候,直接运行 make 即可,不需要像下面一样运行;
make EXTERNAL_MCS=${PWD}/mcs/class/lib/monolite/gmcs.exe
4. 安装 xps 的时候,最新版本会报一个 gmcs not found 的错误,
直接在 cp /usr/local/bin/mcs /usr/local/bin/gmcs 即可以解决此问题;
5. 在 xsp 下部署 MVC5, 文档中的例子 https://github.com/BernardG/AspInfoMvc 直接下载下来,然后到这个目录下运行, xsp4 什么问题都没有;
但是,如果你用 VS2015 产生一个新的项目(注意,创建项目的时候个人认证 环境),然后部署上去的时候,你会发现一个稀奇的错误,
/bin\roslyn\csc.exe 运行时错误,
扑街的问题, VS2015 为了支持 roslyn 编译扩充,新建立的项目自动在 bin 建立了一个 roslyn 目录,下面包含了一个 csc.exe 和 vbc.exe 两个编译器和一堆编译优化的优化的 dll, 这个目录即使你不上传,一样会报 /bin\roslyn\csc.exe 运行时之类的错误 ;
找到 项目文件, 也就是 csproj 文件,
删除下面两行,
<Import Project="..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.0\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props" Condition="Exists('..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.0\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props')" />
<Import Project="..\packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.props" Condition="Exists('..\packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.props')" />,
手动清理bin目录,重新编译项目,你会发现 roslyn 目录已经不会产生,
把整个 web项目目录上传到 ubuntu, 然后在 web 目录下运行 xsp4, 貌似什么问题都没有;
6. 安装和配置 mod_mono
因为,我的 asp.net MVC 需要在一个虚拟目录下运行,主目录文档还是走的 PHP的MVC, 不过,这个也不麻烦,还是根据参考文档,
在 mod_mono.conf 最后面增加如下几行,
Alias /test "/var/www/WebApplication3"
MonoServerPath mvctest "/usr/local/bin/mod-mono-server4"
MonoDebug mvctest true
MonoApplications mvctest "/test:/var/www/WebApplication3"
MonoSetEnv mvctest MONO_IOMAP=all
<Location "/test">
Allow from all
Order allow,deny
MonoSetServerAlias mvctest
SetHandler mono
SetOutputFilter DEFLATE
SetEnvIfNoCase Request_URI ".(?:gif|jpe?g|png)$" no-gzip dont-vary
</Location>
OK, 一切搞定,不过也居然花了两天时间;
不过,暂时还没有支持 MYSQL, 根据,作者的说法, MySQL Connector/Net provider 驱动还不支持 EF6 框架;而 mono 只支持 EF6 (因为 EF6才开始开源),
http://dev.mysql.com/doc/connector-net/en/connector-net-entityframework60.html 但根据这篇文章的说法, MySQL Connector/Net provider 从 6.8起开始支持 EF6了,所以,估计问题不大;
明天拿作者的例子试试看;
就这样了,至于 centos 6.5 , 大家就不要问我了,就是因为 centos 6.5搞不定,我才决定把服务器改成使用 UBUNTU 14.04 LTS的;