zoukankan      html  css  js  c++  java
  • [译]在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, "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

  • 相关阅读:
    linux c dlopen加载动态链接库
    c++锁 测试 (gcc test.cpp -o test -lpthread)
    shell 清理目录下 超过一段时间的数据。
    大话存储学习笔记
    python总结
    正则表达式使用
    #linux shell#模拟日志生成过程
    深入理解Java虚拟机
    Nginx修改access.log日志时间格式
    mfcs100d.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined
  • 原文地址:https://www.cnblogs.com/irocker/p/aspnet5-on-mac.html
Copyright © 2011-2022 走看看