0

ASP.NET 5 và AngularJS Phần 7, Chạy trên Mac

Đây là phần thứ 7 trong phần blog của loạt bài xây dựng ASP.NET 5 (ASP.NET vNext) ứng với AngularJS. Trong loạt bài đăng trên blog, tôi sẽ cho các bạn thấy làm thế nào để có thể tạo ra một ứng dụng Movie đơn giản sử dụng ASP.NET 5, MVC 6, và AngularJS. Bạn có thể tải về mã đã thảo luận trong bài viết blog này từ GitHub: github.com/StephenWalther/MovieAngularJSApp Trong bài viết trên blog này, tôi sẽ xuyên suốt các bước cần thiết để chạy một ứng dụng ASP.NET 5 trên máy Mac. Trong đó, tôi thiết lập các app movie chạy trên OSX Yosemite trên MacBook Pro của tôi. Tôi cố gắng làm theo các hướng dẫn để chạy ASP.NET 5 trên OSX tạo ra bởi nhóm ASP.NET chặt chẽ nhất có thể, nhưng tôi gặp phải một số vấn đề: https://github.com/aspnet/home

Cài đặt Mono

Trước khi bạn có thể chạy ASP.NET 5 trên một máy Mac, bạn phải cài đặt Mono. Dự án Mono là độc lập của Microsoft. Mono là một thực thi mã nguồn mở của .NET cho các nền tảng khác nhau như Mac OSX và Linux. Về lý thuyết, script Homebrew được cung cấp bởi các nhóm ASP.NET nên tự động, cài đặt phiên bản chính xác của Mono, nhưng tôi không thể có được điều này để làm việc. Tôi đã kết thúc cài đặt Mono của bản thân mình bằng cách truy cập các trang sau đây: http://www.mono-project.com/download/ Cài đặt Mono đơn giản. Chúng có một trình cài đặt đẹp mà làm tất cả các công việc. alt

Updating Homebrew

Bước tiếp theo là sử dụng Homebrew cài đặt KVM. Tôi gặp một số vấn đề về việc này để làm việc trên OSX Yosemite. Vấn đề đầu tiên là vị trí của Ruby on Yosemite đã thay đổi mà phá vỡ Homebrew: http://apple.stackexchange.com/questions/153790/how-to-fix-brew-after-its-upgrade-to-yosemite Tôi thực hiện trình tự các lệnh sau đây để cập nhật Homebrew để nó hoạt động với OSX Yosemite:

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

Cài đặt KVM

Sau khi nhận Homebrew, tôi sử dụng Homebrew cài đặt KVM ASP.NET 5. Trước tiên, bạn cần phải thực hiện lệnh sau hỗ trợ aspnet/k GitHub repository với Homebrew: alt

Tiếp theo, hãy chạy lệnh sau để thực hiện cài đặt thực tế của KVM:

brew install kvm

Sau khi chạy lệnh này, tôi chạy vào một lỗi nói rằng KVM đã được cài đặt nhưng "“just not linked". Thực hiện lệnh sau để fix:

sudo brew link kvm

Thoát và nhập lại Terminal và thực hiện lệnh sau để kiểm tra việc lắp đặt KVM và Mono:

kvm list

Trước khi chạy KVM hay lệnh k, bạn cần phải chạy lệnh sau đây đầu tiên:

source kvm.sh

Bạn sẽ cần phải chạy lệnh này một lần và mỗi lần bạn mở Terminal app để Terminal biết nơi để tìm KVM và k.

Cài đặt các ứng dụng phim

Tiếp theo, tôi lấy mã nguồn cho các ứng dụng Phim từ kho GitHub của tôi bằng cách thực hiện các lệnh sau:

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

Các ứng dụng Phim sửa đổi được mô tả trong bài viết trên blog này có thể được tìm thấy trong thư mục PART7. Tôi dùng Sublime để chỉnh sửa các tập tin trong ứng dụng Phim trong khi chạy OSX. alt

Sử dụng dữ liệu trong bộ nhớ

Trong phần trước của loạt bài blog này, tôi sử dụng Entity Framework 7 với Microsoft SQL Server để lưu trữ danh sách các bộ phim. Điều này sẽ không làm việc trên một máy Mac bởi vì bạn không thể chạy Microsoft SQL Server trên một máy Mac. Bạn có một vài sự lựa chọn ở đây:

  • SQLite - SQLite là một cơ sở dữ liệu mã nguồn mở hoạt động trên Windows, Windows Phone, OSX và Linux. Theo trang mô tả (http://www.sqlite.org), nó là cơ sở dữ liệu được triển khai rộng rãi nhất trên thế giới.
  • Azure Database SQL - Kết nối với một cơ sở dữ liệu Microsoft SQL Azure từ ứng dụng của bạn chạy trong OSX. Nói cách khác, tổ chức ứng dụng Phim trên OSX và cơ sở dữ liệu của bạn trong các đám mây.
  • In-Memory - Sử dụng các In-Memory provider cho In-Memory provider để chạy một cơ sở dữ liệu trong bộ nhớ (trong đó mất và biến mất mỗi khi bạn khởi động lại máy chủ web của bạn).

Tôi không thể có được SQLite để làm việc với các phiên bản BETA hiện của ASP.NET 5. Tôi không thể tìm ra method UseSQLite (), vì vậy tôi cho rằng provider này là chưa sẵn sàng. Bạn có thể nhìn vào kho SQLite đây: https://github.com/aspnet/DataCommon.SQLite Sử dụng một cơ sở dữ liệu SQL Azure sẽ là lựa chọn tốt nhất cho một ứng dụng thực tế. Tuy nhiên, tôi không muốn yêu cầu một phụ thuộc bên ngoài để chạy các ứng dụng Phim. Vì vậy, tôi quyết định sử dụng In-Memory provider cho EntityFramework. Những bất lợi của các In-Memory provider là các cơ sở dữ liệu không tồn tại. Tuy nhiên, lợi thế là nó hoạt động trên Windows, OSX và Linux. Tôi đã phải thực hiện hai thay đổi đối với phim app để sử dụng các In-Memory provider. Đầu tiên, tôi đã có thêm một tài liệu tham khảo để EntityFramework.InMemory đến phần phụ thuộc của các tập tin project.json ứng dụng Phim. Thêm phụ thuộc này kéo theo cả gói NuGet cho các nhà cung cấp trong bộ nhớ. Thứ hai, tôi đã phải thực hiện hai thay đổi cho lớp khởi động. Tôi cập nhật các ConfigureServices () trong Startup.cs để kiểm tra xem các ứng dụng đang chạy trên Mono (OSX hay Linux). Khi ứng dụng Phim đang chạy trên Mono, nó sử dụng In-Memory provider. Nếu không, khi ứng dụng Phim đang chạy trên Windows, nó sử dụng 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();
}

Tôi cũng cập nhật method CreateSampleData () trong lớp Startup. Lớp Startup gọi EnsureCreatedAsync () để tạo ra các cơ sở dữ liệu chỉ khi bạn đang chạy các ứng dụng trên Windows và không Mono. Bạn không cần phải tạo ra một tập tin cơ sở dữ liệu thực tế khi sử dụng 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");
    }
}

Sử dụng Kestrel

Bạn không thể sử dụng Internet Information Services (IIS) trên OSX. Thay vào đó, bạn cần phải sử dụng các máy chủ web Kestrel, được xây dựng bởi nhóm ASP.NET để làm việc với cả hai OSX và Linux. Kestrel được xây dựng trên đầu trang của Libuv, mà còn được sử dụng bởi NodeJS. Bạn có thể đọc về Libuv đây: http://nikhilm.github.io/uvbook/ Để sử dụng Kestrel, bạn phải thêm một sự phụ thuộc vào Kestrel đến project.json của bạn. Dưới đây là code phần dependencies (2 phụ thuộc đầu được sử dụng bởi OSX):

"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"
  },  

Bằng cách này, một Kestrel là một loại chim (chim ưng) mà có khả năng đặc biệt là có thể bay trong không khí chết.

Fetching NuGet Dependencies

Trước khi chúng tôi có thể chạy ứng dụng Phim của chúng tôi, chúng ta cần phải Pull trong tất cả các phụ thuộc NuGet mà chúng tôi liệt kê trong file project.json. Thực hiện lệnh sau: alt

Chạy Kestrel

Chúng tôi cuối cùng đã sẵn sàng để chạy các ứng dụng Phim trên OSX. Thực hiện lệnh sau:

k kestrel

Thực hiện lệnh này sẽ khởi động các máy chủ web Kestrel. alt Theo mặc định Kestrel chạy trên cổng 5104. Bạn có thể xác định các cổng được sử dụng bởi Kestrel bằng cách nhìn vào phần lệnh của tập tin project.json của bạn. Mở trình duyệt và điều hướng đến các địa chỉ sau đây và bạn sẽ thấy các ứng dụng Phim: [http: // localhost: 5104](http: // localhost: 5104) alt

Các ứng dụng Phim là hoàn toàn functional. Bạn có thể đăng nhập bằng cách sử dụng người dùng Stephen và Bob (với mật khẩu P@ssw0rd). Nếu bạn đăng nhập như Stephen sau đó bạn có thể thêm, chỉnh sửa, và xóa phim. Bởi vì chúng ta đang sử dụng In-Memory provider, bất kỳ thay đổi mà chúng tôi thực hiện sẽ biến mất khi chúng ta dừng ứng dụng. Nếu bạn muốn giữ lại thay đổi thì bạn nên sử dụng một cơ sở dữ liệu SQL Azure và để dữ liệu của bạn lên đám mây.

Dừng Kestrel

Dừng Kestrel thật bất ngờ khó khăn. Ngày OSX, nhấn CTRL-C trong Terminal sẽ không làm bất cứ điều gì và sẽ không dừng các máy chủ. Dưới đây là những bước mà làm việc cho tôi:

  1. Nhấn CTRL-Z để ngăn chặn Kestrel.
  2. Gõ ps để có được một danh sách các quy trình.
  3. Gõ kill theo quá trình id để ngắt Mono. Có một mô tả StackOverflow của vấn đề này ở đây: http://stackoverflow.com/questions/25712814/how-to-quit-asp-net-kestrel-web-server-on-a-mac alt

Tóm lược

Mục đích của bài này là để mô tả tập các bước mà tôi cần phải hoàn thành để có được ứng dụng Phim chạy trên OSX. Đã có một số va chạm trong cách làm, nhưng nó là tuyệt vời để xem ASP.NET (và Entity Framework) chạy bên ngoài Windows.

Nguồn: https://weblogs.asp.net/StephenWalther


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.