October 19, 2016

Hi dotnet - Phần 1 - Hello world

Nhìn lại thì bài viết “.NET is open source” đã gần được 2 năm. Bây giờ thì mình muốn viết một chuỗi bài về cách để viết, biên dịch và chạy ứng dụng .NET cross-platform (chủ yếu là C#, mình không rảnh VB.net và F#). Tạm đặt tên là “Hi dotnet” vì Microsoft đặt tên dòng lệnh của .NET là dotnet. Dự kiến mình sẽ viết phần về Console Application, chủ yếu là Hello world và phần về ASP.net (MVC và API thôi, không có webform nhé) kèm theo Entity Framework với SQLite/MySQL/PostgreSQL… không chơi SQL Server hay Oracle nhé :)) vì mình không rảnh cài hai cái này. Bên cạnh đó là deploy trên server với Docker. Bạn có thể theo dõi mã nguồn trên github (thư mục 1-HelloWorld).

.NET Core

Trong phần đầu tiên này thì sẽ giới thiệu cách để tạo một project từ số 0, nghĩa là bạn sẽ nắm được tối thiểu mình cần gì để chạy được một ứng dụng C# Hello world. Trong phần ví dụ thì mình sẽ chỉ có thể demo trên Mac, trên Linux thì gần như tương tự. Đối vơi Windows thì sẽ có một số khác biệt, chủ yếu là đường dẫn thư mục, lệnh command line để truy xuất nhưng cái đó bạn có thể tự suy diễn được, và dĩ nhiên là không dễ như việc tạo project trên Visual Studio. Mình thì thích dùng command line và cố gắng hiểu được những gì có trong project. Và trong đây mình chỉ dùng .NET Core (cross-platform), không phải bản .NET chỉ chạy trên Windows, ngoài ra có thể đọc thêm tại đây để biết sự khác biệt.

.NET, .NET Core, Xamarin [1]

Đầu tiên là download và cài đặt dotnet cho hệ điều hành của bạn tại đây. Có hướng dẫn cho từng hệ điều hành khác nhau. Sau khi cài đặt thì bạn có thể mở terminal để sử dụng các lệnh .NET. Ngoài ra bạn cần cài thêm Atom/Sublime hoặc bất cứ code editor nào mà bạn thích. Tuy nhiên để debug được C# thì bạn nên sử dụng VSCode của Microsoft, mình không chắc mấy cái kia có plugin không?

Microsoft xây dựng .NET Core cố gắng đơn giản mọi thứ nhưng mình thiệt vẫn thấy nó hơi phức tạp để bắt đầu: Phải tạo project để viết được Hello world. Một project .NET Core đơn giản nhất bao gồm 2 tập tin: project.json .csproj và Program.cs (tên gì cũng được, miễn có hàm Main). Có vẻ Microsoft cũng theo cách mà cộng động mã nguồn mở sử dụng… cái-gì-đó.json (bower.json, package.json) để mô tả một projectcập nhật là khoảng cuối năm 2016 Microsoft sẽ trở lại với định dạng project dạng XML csproj nhưng được cập nhật đơn giản hơn. Tuy nhiên hiện tại vẫn phải dùng project.json vì tool với chưa release, khi nào có mình sẽ cập nhật lạiĐã cập nhật csproj thay project.json. Nhưng file project.json .csproj là bắt buộc để chạy được ứng dụng .NET Core, tập tin này bao gồm mô tả về project, framework/runtime sử dụng (.NET hay .NET Core hay mono) và dĩ nhiên không thể thiếu là các dependency. Không giống như Node, các dependency của project .NET Core được cài đặt ở đâu đó trên hệ thống chứ không nằm trong cấu trúc thư mục của project. Bên cạnh đó, bạn có thể sử dụng lệnh dotnet new hoặc các template có sẵn của yeoman.

1-HelloWorld.csproj

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp1.1</TargetFramework>
  </PropertyGroup>

</Project>

Bạn có thể chỉnh sửa lại defaultNamespace thành namespace mà bạn dùng. Và dĩ nhiên không thể thiếu Program.cs chứa mã nguồn in Hello world.

Program.cs

using System;

namespace ConsoleApplication
{
  public class Program
  {
    public static void Main(string[] args)
    {
      Console.WriteLine("Hello world");
    }
  }
}

Chúng ta chỉ sử dụng namespace System. Mình thích sử dụng 2 space hơn là tab 4 space của Visual Studio. Sau đó mở terminal, cd vào thư mục project và chạy lệnh để download các dependency của project:

cd ConsoleApplication
dotnet restore

Lệnh restore sẽ tạo ra file project.lock.json các file trong thư mục obj chứa phiên bản chính xác của toàn bộ các dependency. Theo như khuyến cáo thì bạn NÊN cho nó vào .gitignore, tức là nó sẽ được generate ra mỗi lần project được clone về một máy. Cuối cùng chạy lệnh để build và run:

dotnet build
dotnet run

Bạn không cần chạy lệnh build trước vì khi run lệnh build sẽ tự chạy.

Hello world

Vậy là đã hoàn thành xong Hello world :). Hẹn gặp phần tiếp theo!