OSX 上初步尝试 asp.net 5

根据微软的介绍,与我之前的一些总结,可以看到 ASP.NET 以及 .NET 平台会有下面几个变化:

  • 代码使用 Apache 协议开源,并且托管于 Github 上。
  • 新的 C# 编译器 Roslyn。
  • 一个新的跨平台的 CLR(对应 Java 平台的 JVM)。
  • 新的项目组织与构建工具KVM。
  • 基础库 corefx。

这些概念都有点让人觉得云深雾绕,仔细研究就会发现,其实 ASP.NET 借鉴了大量 node.js 与 Ruby 社区的概念与架构。对应如下:

KVM

对应 Ruby 社区的 RVM,与 node.js 社区的 NVM / N。可以管理你的 ASP.NET 的执行环境(CLR),比如指定使用 coreclr 还是 mono,以及它们的具体版本。使用上也很像。

KPM

对应 Ruby 社区的 gem,与 node.js 社区的 npm。可以管理你的第三方包依赖。但是实际实现上,还是复用先用的 NuGet,包也是 NuGet 的包。但是不同的是,使用了 Project.json 文件格式作为依赖声明,并且也会自动帮你管理循环依赖。这个简直就是直接把 npm 借鉴了一遍,格式都很像。

coreclr

一个新的精简版跨平台的 CLR,(据说继承自 silverlight?),使用 C++ 实现,并且十分精简(只有几 M 大小),因此可以直接在 Project.json 里面指定使用哪个版本,构建的时候直接在线下载。当然大家一直关心的 mono 也在这里找到了自己的角色,你也可以选用 mono 作为执行环境(现阶段 coreclr 还没有 production ready,mono是比较好的选择)。当然你也可以使用传统的 CLR 来作为运行时(现在称为 full .NET CLR)。

Roslyn

使用 C# 写的 C# 编译器,更加开放和组件化,主要是帮你编译你写的代码以及第三方依赖的代码。并且目测会在代码补全和代码重构方面发力,因为微软并没有打算把 Virtual Studio 给 Linux 和 OSX 用户用,C# 这种静态类型语言毕竟还是比较依赖代码补齐的。

corefx

coreclr 只是一个 CLR,C# 中字符串等基本的功能还是使用 C# 编写的,还有很多其它的基础库,这部分代码就作为 corefx 存在了,并且绝大部分代码都是跨平台的。其中包括 IO,线程,Linq,集合等等一系列类库。这样不管你的代码是运行在 coreclr 还是 mono 环境中,兼容性都会有一定的保证。

kestrel

微软也没打算把 IIS 跨平台到 Linux 和 OSX,因此有了 kestrel 这个 HTTP Server,基于 libuv。说是给开发环境用,但是估计以后也能达到线上服务的强度。

以上概念虽然多,但是 asp.net 5 安装和使用起来并不复杂,只要安装好 KVM 这一个工具就好了。

KVM 的项目是 https://github.com/aspnet/Home (这个项目名字真的有点让人摸不着头脑,直接叫 KVM 或者 K 不就好了),实际上就是几个 shell 脚本(bash / powershell)。

以下内容基于 KVM beta3

OSX 下直接用 homebrew 安装就好,微软已经做好了brew tap,以后正式 release 应该会提交给 homebrew。

brew tap aspnet/k  
brew install kvm  

安装时会有个 postinstall 的过程,自动帮你执行了 kvm upgrade,ASP.NET 相关文件很 Unix 地帮你放在了 ${HOME}/.k/ 目录下,并且自动使用 mono 作为 runtime:

tree ~/.k  
/Users/asaka/.k
├── alias
│   └── default.alias
└── runtimes
    └── kre-mono.1.0.0-beta3
        ├── bin
        │   ├── Microsoft.CodeAnalysis.CSharp.Desktop.dll
        │   ├── Microsoft.CodeAnalysis.CSharp.dll
        │   ├── Microsoft.CodeAnalysis.Desktop.dll
        │   ├── Microsoft.CodeAnalysis.dll
        │   ├── Microsoft.Framework.ApplicationHost.dll
        │   ├── Microsoft.Framework.Runtime.Loader.dll
        │   ├── Microsoft.Framework.Runtime.Roslyn.Common.dll
        │   ├── Microsoft.Framework.Runtime.Roslyn.dll
        │   ├── Microsoft.Framework.Runtime.dll
        │   ├── Microsoft.Net.Http.Client.dll
        │   ├── Newtonsoft.Json.dll
        │   ├── System.Collections.Immutable.dll
        │   ├── System.Reflection.Metadata.dll
        │   ├── k
        │   ├── klr
        │   ├── kpm
        │   ├── kre.host.dll
        │   ├── kre.mono.managed.dll
        │   └── lib
        │       ├── Microsoft.Framework.DesignTimeHost
        │       │   └── Microsoft.Framework.DesignTimeHost.dll
        │       ├── Microsoft.Framework.PackageManager
        │       │   └── Microsoft.Framework.PackageManager.dll
        │       └── Microsoft.Framework.Project
        │           └── Microsoft.Framework.Project.dll
        ├── kre-mono.nuspec
        └── package
            └── services
                └── metadata
                    └── core-properties
                        └── 5d2fd91bec5d411ca81c8c3df4d03749.psmdcp

12 directories, 24 files  

有一点很不 Unix 的就是,kvm 实现成了一个 shell 函数,而不是一个可执行文件,因此你每次使用的时候都要 source kvm.sh 一下(貌似 rvm 也是这样?)。可以在 .zshrc 一类的地方干这件事。

然后 kvm install 可以安装其他版本的 runtime,也会装到 ${HOME}/.k/ 目录下。kvm use 可以选择某个 runtime 作为当前 runtime。还有一系列 upgrade alias的命令,和 rvm/nvm 差不多。roslyn 也包括在 kvm runtime 之中,不过没有可执行文件来直接启动。

kvm 安装的 runtime 里面也包含 kpm、klr 和 k 三个命令行工具。klr 实际上是当前的 CLR,这里其实就是启动了 mono。kpm 其实是 NuGet,k 类似于构建工具,帮你设置好环境变量,编译代码,并且帮你启动你的代码。

刚才 KVM 的那个 repo 里面还有几个 sample,可以 clone 下来自己跑着玩。不过目前在默认 runtime 之下,除了 ConsoleApp 之外我这里都跑不起来,估计是很久没维护,依赖出了问题什么的。

跑项目的时候,需要使用 kpm restore 一下安装依赖。对于 ConsoleApp 类的项目,直接 k run 就可以运行你的代码,就是直接编译好了之久运行 Main 函数。

web 类的项目,需要使用 k web 来使用内置的 HTTP Server 运行。但是 sample 的那几个例子都跑不通。这里还使用 k kestrel 来启动 kerstrel 跑。

仔细观察就可以发现,现在如果写一个命令行工具,那只要写好 Project.json 来指定相关依赖,就可以任意想以自己的方式来组织代码了。但是对于 asp.net 项目,或者其他类似的项目,虽然现在已经没有了 web.config ,但是凭空去手敲出来一个项目框架还是很繁琐的。asp.net 中增加 Controller 一类的工作也是很繁琐的,之前 Virtual Studio 可以帮助我们做这些工作。

所以我们需要一个脚手架工具,这个在 rails 有比较完美的解决方案,rails 本身就可以帮我们做这些事情。后来 node.js 社区的 yo 项目把这个功能借鉴了去,可以生成各种前端以及 node.js 项目,并且 yo 也一直没有限定自己只在前端和 JS 社区,本身可以通过写新的 generator 来支持各种类型的项目。

因此就有了 generator-aspnet 这个项目。这个项目属于 OminiSharp 组织,非微软官方,但是发起人确实微软官方,所以你知道我在说什么。

装上 yo 和 generator-aspnet 就可以很方便的生成 asp.net 以及使用各种脚手架功能了。

npm install -g yo  
npm install -g generator-aspnet  

尝试一下:

yo aspnet

     _-----_
    |       |    .--------------------------.
    |--(o)--|    |      Welcome to the      |
   `---------´   |   marvellous ASP.NET 5   |
    ( _´U`_ )    |        generator!        |
    /___A___\    '--------------------------'
     |  ~  |
   __'.___.'__
 ´   `  |° ´ Y `

? What type of application do you want to create? (Use arrow keys)
❯ Empty Application
  Console Application
  Web Application
  Web API Application
  Nancy ASP.NET Application
  Class Library

现在支持的项目类型也比较完善,甚至还支持 Nancy 这个很像 sinatra 和 express 的轻量级 .net web 框架。

项目创建完成之后,可以进入项目根目录,如果是 Web Application(也就是以前的 MVC 框架),这样运行(restore之前最好先用 npm 装上 bower 和 grunt-cli,yo 生成出来的项目是依赖这两个来构建前端的,restore 过程中会执行构建过程):

kpm restore  
kpm build  
k kestrel  

当然不知为何,我这里用k kestrelk web 都跑不起来,应该还是因为 Beta 的原因吧。不过可以观察一下项目目录结构,发现构建前端的 grunt 和 bower 都已经配置好了,并且默认启用 Razer 做模板引擎,也使用了 Entity Framework 作为 ORM 框架,十分完善。

另外看 generator-aspnet 的文档,有如下脚手架:

aspnet:MvcController  
aspnet:MvcView  
aspnet:WebApiContoller  
aspnet:Class  
aspnet:StartupClass  
aspnet:BowerJson  
aspnet:CoffeeScript  
aspnet:Config  
aspnet:Gulpfile  
aspnet:HTMLPage  
aspnet:JavaScript  
aspnet:JScript  
aspnet:JSON  
aspnet:PackageJson  
aspnet:TextFile  
aspnet:TypeScript  

很好很强大。

原文发布于微信公众号 - 我为Net狂(dotNetCrazy)

原文发表时间:2016-02-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏walterlv - 吕毅的博客

项目文件中的已知 NuGet 属性(使用这些属性,创建 NuGet 包就可以不需要 nuspec 文件啦)

发布于 2018-05-10 13:49 更新于 2018-06...

11210
来自专栏农夫安全

CVE-2017-11882漏洞复现

0x00 前言 参考backlion师傅的PDF,记录一下这个过程。 2017年11月14日,微软发布了11月份的安全补丁更新,其中比较引人关注...

39080
来自专栏依乐祝

.NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了

很多朋友看到.NET Core就认为是ASP.NET Core,其实这是有误区的,因为.NET Core 是开放源代码的通用开发平台 (是一个“平台”),基于这...

16220
来自专栏程序员的SOD蜜

OData – the best way to REST–实例讲解ASP.NET WebAPI OData (V4) Service & Client

一、概念介绍 1.1,什么是OData? 还是看OData官网的简单说明: An open protocol to allow the creation and...

46650
来自专栏程序员与猫

ASP.NET Core服务器综述

原文地址:Servers overview for ASP.NET Core By Tom Dykstra, Steve Smith, Stephen Halt...

27450
来自专栏张善友的专栏

.NET Core 2.1 Preview 2发布 - April 10, 2018

19850
来自专栏张善友的专栏

开发人员应该知道Windows 7的十大技巧

最近我在笔记本上安装了64位的Windows 7,今天逛的时候看到Scott Hanselman’s 写的一篇文章Top 10 Tips Working Dev...

18950
来自专栏walterlv - 吕毅的博客

UWP 应用中 CoreApplication / Application, CoreWindow / Window 之间的区别

发布于 2018-07-29 23:51 更新于 2018-08...

33920
来自专栏乐百川的学习频道

Powershell快速入门(一) 安装和使用

一说起 Shell 编程,我们大家想到的应该都是Linux 下的 Shell 编程。其实 Windows 下也可以使用功能强大的 Shell 来编写程序,这就是...

28360
来自专栏木宛城主

ASP.NET MVC 随想录——开始使用ASP.NET Identity,初级篇

在之前的文章中,我为大家介绍了OWIN和Katana,有了对它们的基本了解后,才能更好的去学习ASP.NET Identity,因为它已经对OWIN 有了良好...

66580

扫码关注云+社区

领取腾讯云代金券