在Mac上运行ASP.NET 5

原文: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, "[email protected]");
        await userManager.AddClaimAsync(stephen, new Claim("CanEdit", "true"));

        // add normal user
        var bob = new ApplicationUser
        {
            UserName = "Bob"
        };
        await userManager.CreateAsync(bob, "[email protected]");
    }
}

使用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登陆 (密码为 [email protected]).

停用 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

时间: 2024-11-06 12:57:57

在Mac上运行ASP.NET 5的相关文章

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/. 今天在Mac上更新了Mono 4 和Xamarin Studio 5.9. 使用Xamarin Studio 创建了一个asp.net mvc 项目: 模版使用的是5.2.0 版本的,目标框架是Mono/.NET 4.5,我通过Nuget 更新到了5.2.3 , 更新包的过程中需要调整下web.config

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

运行ASP.NET程序的三要素: 1) CLR(.NET运行时) 2) KRE(ASP.NET运行时) 3) Web服务器 所以在Mac OS X上运行ASP.NET程序,就需要对应这三要素的东西: 1) CLR - Mono(目前只有Mono可以用,以后可以用Core CLRE) 2) KRE - KRE-Mono(基于Mono的KRE) 3)Web服务器 - Kestrel 接着,用下面的4个命令将这三样东西安装上即可: brew tap aspnet/k brew install kvm

mac上运行zanphp的demo

mac上运行zanphp的demo 初入PHP的深坑,需要配置下zanphp的环境来运行下zanphp的demo. 安装php 需要安装些基本的软件,通过brew安装安装php,这里版本选了5.6 brew tap homebrew /homebrew-php brew install php56 --with-fpm   安装扩展,工作中使用非必须 brew install --build-from- source php56-mcrypt brew install php56-redis b

在Linux上运行ASP.NET vNext

最新的ASP.NET vNext完全开源且可以跨多个平台运行,在Windows环境下我尝试了下,几乎没花什么工夫就跑起了Sample,而在Linux环境下则要多花了不少时间,所以特别记录下整个过程,希望对其他想要尝鲜的人有所帮助. 运行环境 Ubuntu Server 14.04 VirtualBox Mono >= 3.4.1 *由于Ubuntu库中的Mono版本比较陈旧,满足不了最低要求,所以第一步要做的就是安装最新版本的Mono. 安装Mono 1. 首先从GitHub上取得mono代码:

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

昨天微软发布了ASP.NET 5 beta2(详见ASP.NET 5 Beta2 发布),对ASP.NET 5的好奇心又被激发了. 今天下午在Mac OS X上体验了一下ASP.NET 5 beta2,而且借助Yeoman generators for ASP.NET 5,可以不用写1行代码,连project.json都不用写.有一种Mac下用Visual Studio的感觉. 下面分享一下实际的操作步骤: 1. 安装OS X的包包管理器:Homebrew 2. 将ASP.NET 5在githu

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

运行: ./bin/cassandra 得到输出结果: objc[1881]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/bin/java and /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/libinstrument.d

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

新的项目我们想用ASP.NET Core来开发,但是苦于我们历史的遗产很多,比如<使用 JavaScriptService 在.NET Core 里实现DES加密算法>,我们要估计等到.NET Core 1.2我们才会有大部分的API,通过NodeJs方式有点曲线救国的味道,很多人会不认同,如果要在纯的.NET Core下运行我们的ASP.NET Core项目,在特定的时间进度内很难办到,不仅仅我们所依赖的一些API还没有,还有我们大量的.NET Framwork的库还来不及迁移到.NET S

Flutter -- Mac上运行Android创建的Flutter的若干报错解决

上篇博文里,我运行起来了我在git上下载的一个flutter项目,同事(android开发)这段时间也在研究Flutter,并且他自己写了一个Demo,我寻思着把他的项目拿过来,我看能运行起来否,结果一大堆问题. 下面我列出来了一部分,在我经过半个小时的百度,以及对比git上下载下来的项目里面的配置.终于解决了,成功的在我的6s和模拟器上跑起来了. 下面附上了 应用的四张截图,给安卓同事 点赞 1.Command PhaseScriptExecution failed with a nonzer

如何在mac上运行vue项目

使用终端安装Vue运行环境 1.安装 Homebrew Homebrew 是osx下面最优秀的包管理工具,没有之一.先在终端查看是否已安装brew brew -v 如果返回 Homebrew 的版本号 例如:Homebrew 1.3.6 那么恭喜你,可以跳过这一步,如果没有,那就乖乖执行第一步. /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)&quo