原文:http://stephenwalther.com/archive/2015/02/03/asp-net-5-and-angularjs-part-7-running-on-a-mac

这篇文章中, 我会把之前的ASP.NET 5 项目在我的Mac上运行起来.

安装 Mono

首先你得安装Mono. Mono项目独立于Microsoft. Mono是一个.NET运行在Mac OSX和Linux上的开源实现.

http://www.mono-project.com/download/

安装Mono非常方便、友好.

更新 Homebrew

下一步是使用Homebrew 安装 KVM. 在这一步我遇到了几个问题.

第一个问题是Ruby在Yosmite上的位置发生了改变, 这导致了Homebrew不能工作:

http://apple.stackexchange.com/questions/153790/how-to-fix-brew-after-its-upgrade-to-yosemite

我执行下面的命令更新Homebrew, 这样Homebrew就能在OSX Yosemite工作了:

cd /System/Library/Frameworks/Ruby.framework/Versions
sudo ln -s Current 1.8
sudo brew update
sudo rm 1.8

安装KVM

Homebrew能正常工作后, 使用Homebrew安装ASP.NET 5 KVM. 首先, 你需要运行下面的命令让aspnet/k GitHub repository 和 Homebrew 关联起来:

下一步, 运行下面的命令安装kvm:

brew install kvm

(国内网络不好, 可能需要翻墙安装)

运行后, 我遇到了一个错误kvm 已安装, 但是“just not linked”. 执行下面的命令修复这个问题:

sudo brew link kvm

执行下面的命令验证kvm和Mono是否安装正常:

kvm list

在运行kvm或k命令前, 你需要运行下面的命令:

source kvm.sh

每次你打开Terminal的时候都需要运行一次这个命令, 这样Terminal才知道去哪找kvm和k.

安装Movies App

下一步, 我从GitHub repository获取Movies app的源代码, 执行下面的命令:

git clone https://github.com/StephenWalther/MovieAngularJSApp.git

在Mac上我使用Sublime Text作为.Net App的编辑器.

使用In-Memory数据库

Movies App使用的是EF7和Microsoft SQL Server. Microsofe SQL Server不能在Mac上运行.

关于数据库你有下面的选择:

  • SQLite – SQLite是一个开源的数据库, 可以运行在Windows, Windows Phone, OSX, Linux上. .

  • Azure SQL Database – 把你的数据库部署在云端.

  • In-Memory – 使用内存数据库 (注意了一重启web服务数据就全丢了).

我不能让SQLite在ASP.NET 5 的BETA版本上工作起来. 找不到UseSQLite()方法, 我猜可能是这个SQLite的Provider还没有支持BETA版本的ASP.NET 5.

使用Azure SQL Database对于真实应用来说是一个最好的选择.

我选择在这个例子中使用In-Memory数据库.

为了Movies app使用In-Memory Provider我要做2处修改. 首先, 我要在project.json文件的dependencies section中添加EntityFramework.InMemory的引用.

然后, 修改Startup类. 修改Startup.cs中的ConfigureServices()方法检查是否运行在Mono (OSX 或 Linux)环境下. 当Movies app运行在Mono环境下,使用In-Memory provider. 否则, 使用 Microsoft SQL Server.

public void ConfigureServices(IServiceCollection services)
{ //Sql client not available on mono
var usingMono = Type.GetType("Mono.Runtime") != null; // Add EF services to the services container
if (usingMono)
{
services.AddEntityFramework(Configuration)
.AddInMemoryStore()
.AddDbContext<MoviesAppContext>();
} else {
services.AddEntityFramework(Configuration)
.AddSqlServer()
.AddDbContext<MoviesAppContext>(options =>
{
options.UseSqlServer(Configuration.Get("Data:DefaultConnection:ConnectionString"));
});
} // add ASP.NET Identity
services.AddIdentity<ApplicationUser, IdentityRole>(Configuration)
.AddEntityFrameworkStores<MoviesAppContext>(); // add ASP.NET MVC
services.AddMvc();
}

更新Startup类的CreateSampleData() 方法. 只有运行在windows上才调用EnsureCreatedAsync()创建数据库. 当使用In-Memory provider的时候不需要创建数据库文件.

private static async Task CreateSampleData(IServiceProvider applicationServices)
{
using (var dbContext = applicationServices.GetService<MoviesAppContext>())
{
// ensure SQL Server database created
var sqlServerDatabase = dbContext.Database as SqlServerDatabase;
if (sqlServerDatabase != null)
{
sqlServerDatabase.EnsureCreatedAsync().Wait();
} // add some movies
var movies = new List<Movie>
{
new Movie {Title="Star Wars", Director="Lucas"},
new Movie {Title="King Kong", Director="Jackson"},
new Movie {Title="Memento", Director="Nolan"}
};
movies.ForEach(m => dbContext.Movies.AddAsync(m)); // add some users
var userManager = applicationServices.GetService<UserManager<ApplicationUser>>(); // add editor user
var stephen = new ApplicationUser
{
UserName = "Stephen"
};
var result = await userManager.CreateAsync(stephen, "P@ssw0rd");
await userManager.AddClaimAsync(stephen, new Claim("CanEdit", "true")); // add normal user
var bob = new ApplicationUser
{
UserName = "Bob"
};
await userManager.CreateAsync(bob, "P@ssw0rd");
}
}

使用Kestrel

无法在OSX下使用IIS. 在OSX下你需要使用Kestrel web服务器, 这个是ASP.NET团队开发的.

Under the covers, Kestrel is built on top of Libuv, which is also used by NodeJS. You can read about Libuv here:

http://nikhilm.github.io/uvbook/

为了使用Kestrel, 你需要在project.json文件中添加kestrel依赖. 下面是我完整的依赖section:

"dependencies": {
"Kestrel": "1.0.0-*",
"EntityFramework.InMemory": "7.0.0-*", "EntityFramework.SqlServer": "7.0.0-beta2",
"EntityFramework.Commands": "7.0.0-beta2",
"Microsoft.AspNet.Mvc": "6.0.0-beta2",
/* "Microsoft.AspNet.Mvc.WebApiCompatShim": "6.0.0-beta2", */
"Microsoft.AspNet.Diagnostics": "1.0.0-beta2",
"Microsoft.AspNet.Diagnostics.Entity": "7.0.0-beta2",
"Microsoft.AspNet.Identity.EntityFramework": "3.0.0-beta2",
"Microsoft.AspNet.Security.Cookies": "1.0.0-beta2",
"Microsoft.AspNet.Server.IIS": "1.0.0-beta2",
"Microsoft.AspNet.Server.WebListener": "1.0.0-beta2",
"Microsoft.AspNet.StaticFiles": "1.0.0-beta2",
"Microsoft.Framework.ConfigurationModel.Json": "1.0.0-beta2",
"Microsoft.Framework.CodeGenerators.Mvc": "1.0.0-beta2",
"Microsoft.Framework.Logging": "1.0.0-beta2",
"Microsoft.Framework.Logging.Console": "1.0.0-beta2",
"Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0-beta1"
},

获取 NuGet Dependencies

在运行Movies app之前, 我们需要从NuGet下获取到project.json文件中定义的依赖. 执行下面的命令:

kpm restore

运行Kestrel

执行下面的命令:

k kestrel

执行上面的命令会开始启用 Kestrel web 服务器.

Kestrel默认的端口为5104. 你可以在project.json文件中的commands section中看到kestrel是使用的哪个端口.

打开:

http://localhost:5104

你可以用 Stephen 或 Bob登陆 (密码为 P@ssw0rd).

停用 Kestrel

停用Kestrel出奇意外的麻烦. 在OSX里, 在终端CTRL-C不会做任何事情, 也不会停止服务. 下面是我的步骤:

  1. CTRL-Z停止Kestrel.

  2. 输入 ps 获取到所有进程.

  3. 输入 kill process id 结束Mono进程.

下面是StackOverflow对这个问题的讨论:

http://stackoverflow.com/questions/25712814/how-to-quit-asp-net-kestrel-web-server-on-a-mac

注意了我目前安装的mono是3.12.1 这个版本有个bug 运行k kestrel 报错, too many open files.... 如下图:

这是mono 3.12.1 的一个bug。

在运行

k kestrel

之前,运行

export MONO_MANAGED_WATCHER=disabled

就行了。详见https://github.com/aspnet/Mvc/issues/2118#issuecomment-77169959

[译]在Mac上运行ASP.NET 5的更多相关文章

  1. Mono 4.0 Mac上运行asp.net mvc 5.2.3

    Mono 4.0 已经发布,二进制包已经准备好,具体的发布说明参见:http://www.mono-project.com/docs/about-mono/releases/4.0.0/. 今天在Ma ...

  2. 简单理解在Mac OS X上运行ASP.NET程序

    运行ASP.NET程序的三要素: 1) CLR(.NET运行时) 2) KRE(ASP.NET运行时) 3) Web服务器 所以在Mac OS X上运行ASP.NET程序,就需要对应这三要素的东西: ...

  3. 在Mac下运行ASP.NET Core应用程序

    在Mac下运行ASP.NET Core应用程序 通过参照.NET Core相关官方文档,在我的Mac电脑上用Visual Studio Code创建了我的第一个ASP.NET应用. 开发环境搭建 首先 ...

  4. Mac下运行ASP.NET Core应用程序

    Mac下运行ASP.NET Core应用程序 在Mac下运行ASP.NET Core应用程序 通过参照.NET Core相关官方文档,在我的Mac电脑上用Visual Studio Code创建了我的 ...

  5. [翻译]第三天- 在 Mac 上运行 .NET Core 应用程序

    原文: http://michaelcrump.net/part3-aspnetcore/ *** 简介 该系列文章的完整列表如下: 第一天 - 在 Windows 下安装和运行 .NET Core ...

  6. mac 上运行cassandra出现的java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException: : : unknown error错误解决方法

    mac 上运行cassandra出现的java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostExce ...

  7. 不写1行代码,在Mac上体验ASP.NET 5的最简单方法

    昨天微软发布了ASP.NET 5 beta2(详见ASP.NET 5 Beta2 发布),对ASP.NET 5的好奇心又被激发了. 今天下午在Mac OS X上体验了一下ASP.NET 5,而且借助Y ...

  8. 在传统.NET Framework 上运行ASP.NET Core项目

    新的项目我们想用ASP.NET Core来开发,但是苦于我们历史的遗产很多,比如<使用 JavaScriptService 在.NET Core 里实现DES加密算法>,我们要估计等到.N ...

  9. ASP.NET Core 中文文档 第二章 指南(5) 在 Nano Server 上运行ASP.NET Core

    原文 ASP.NET Core on Nano Server 作者 Sourabh Shirhatti 翻译 娄宇(Lyrics) 校对 刘怡(AlexLEWIS).许登洋(Seay).谢炀(kile ...

随机推荐

  1. Visual Studio插件

    不定时更新,得到最好用的插件.(友情提示:安装插件时最好先备份系统) 1.Resharper 10.0.0.12.VS10x CodeMAP3.JavaScript Map Parser4.JScri ...

  2. Mysql Index、B Tree、B+ Tree、SQL Optimization

    catalog . 引言 . Mysql索引 . Mysql B/B+ Tree . Mysql SQL Optimization . MySQL Query Execution Process 1. ...

  3. 08CMS Variable Override Write Arbitrarily WEBSHELL Into Arbitrarily Path

    目录 . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 简单描述这个漏洞 . /include/general.inc.php //本地变 ...

  4. Android虚拟机Classic qemu does not support SMP问题记录

    不及之前重装了一次系统,导致要重新搭建android开发环境,但是在启动AVD时queue遇到了这个问题 androidstudio中看到的是这个样子 大概查了一下,应该是创建虚拟机是选择的cpu构架 ...

  5. iOS - 装饰对象

    1.设计模式原则 多组合,少继承 类对拓展开放,对修改关闭 派生的子类接口是在编译时就静态决定的,而所有子类都会继承到相同的接口.然而,利用组合或者说装饰模式来拓展抽象类的接口,就可以在运行时动态的进 ...

  6. JavaWeb---总结(十四)JSP原理

    一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...

  7. java的对象的总结:(PO,VO,DAO,BO,POJO)

    一.PO:persistant object 持久对象,可以看成是与数据库中的表相映射的java对象.最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合.PO中应该不包含任何对数 ...

  8. spark 加载文件

    spark 加载文件 textFile的参数是一个path,这个path可以是: 1. 一个文件路径,这时候只装载指定的文件 2. 一个目录路径,这时候只装载指定目录下面的所有文件(不包括子目录下面的 ...

  9. 20145212 实验三《敏捷开发与XP实践》

    20145212 实验三<敏捷开发与XP实践> 实验内容 使用git上传代码 与20145223同学一组,使用git相互更改代码 同组实验报告链接:http://www.cnblogs.c ...

  10. 20145212 《Java程序设计》第5周学习总结

    20145212 <Java程序设计>第5周学习总结 教材学习内容总结 第八章 1.Java中所有错误都会被打包为对象,通过try和catch语法可以对代表错误的对象做处理. try{ . ...