.NET Core多平台开发体验[3]: Linux (Windows Linux子系统)
如果想体验Linux环境下开发和运行.NET Core应用,我们有多种选择。一种就是在一台物理机上安装原生的Linux,我们可以根据自身的喜好选择某种Linux Distribution,目前来说像RHEL、Ubuntu、Debian、Fedora、CentOS和SUSE这些主流的Distribution都是支持的。如果读者朋友们觉得这种方式比较麻烦,我们也可以采用虚拟机的形式安装相应的Linux Distribution,比如我经常使用的都是安装在VirtualBox上的Ubuntu。对于64为Windows 10的用户来说,我们有了第三种选择,那就是Windows 10提供的Linux子系统(WSL: Windows Subsystem for Linux),接下来我们就来演示在WSL上运行.NET Core应用。
一、启用Linux子系统
接下来我们来简单介绍一下如何启用Linux子系统。首选需要提醒读者朋友们的是:只有64位的Windows 10周年纪念版本才提供对Linux子系统的支持,如果你的Windows 10版本比较老,你需要将它升级到较新的版本。在这之后,我们需要开启系统的开发者模式(Developer Mode),对此我们只需要选择“设置(Settings)”>“更新与安全(Update and Security)”打开如下这个对话框。我们只需在左侧选择“针对开发人员(For developers)”,并在右侧提供的三个选项中选择“开发者模式(Developer Model)”。
系统的开发者模式被启用之后,我们需要通过“控制面板(Control Panel)”>“程序与功能(Programs and Features)”打开如下图所示的“程序与功能”对话框,并选择“启用或关闭Windows功能(Turn Windows features on or off)”打开“Windows功能”对话框。当我们勾选“适用于Linux的Windows子系统(Windows Subsytem for Linux”)选项并重启后,针对Linux的Windows子系统特性被正式启用。
当针对Linux的Windows子系统特性其中之后,系统赋予了我们一个名为lxrun的命令来管理这个子系统,我们可以利用它来安装、卸载和更新Linux系统。到目前为止,我们仅仅是开启了Linux子系统这个Windows特性,并没有一个具体的Linux Distribution被安装,所以我们现在需要做的就是以如下图所示的形式执行“lxrun /install”命令安装一个具体的Linux Distribution,该命令目前为我们安装的是Ubuntu。Linux子系统完成之后,我们只需要制定用户名和密码创建一个登录账号即可。
当Linux被成功安装之后,我们可以在CMD命令行中执行bash命令进入Linux Bash Shell。如下图所示,我们在CMD命令行中执行bash命令之后会自动进入Linux Bash Shell。我们在Bash Shell中执行lsb_release -a命令输出当前安装的Linux Distribution的版本信息。如果想恢复到CMD命令行模式,我们只需要执行exit命令退出Bash Shell即可。
作为主系统的Windows和Linux子系统可以共享网络系统和文件系统。Windows下的文件系统直接挂载到“/mnt”目录下,所以Windows下的文件或者目录路径加上行“/mnt”前缀就变成了基于Linux子系统下的路径。如图1-25所示,CMD命令行环境下的当前工作目录为“c:usersjinnan”,当我们切换到Bash Shell后,当前工作目录其实并没有发生变化,只是路径变成了“/mnt/c/users/jinnan”而已。
二、安装开发环境
如果我们想在Linux下运行.NET Core应用,我们也只需要安装.NET Core SDK就可以了。针对不同的Linux Distribution,.NET Core SDK的安装略有不同。对于主流的Linux发行版本(RHEL、Ubuntu、Debian、Fedora、CentOS和SUSE等), .NET Core的官方站点上给出了安装.NET Core SDK的详细教程,在这里我们针对WSL的版本(Ubuntu 16.04.2 )简单介绍一下如何安装对应的SDK。
对于Ubuntu下安装.NET Core SDK,我们只需要执行apt-get安装对应的deb包就可以了,不过在这之前我们需要确保该包所在Feed的URL在本地被注册。至于该Feed URL的注册,则主要涉及到两个步骤,第一个步骤是注册用于检验deb包完整性的签名密钥(Signature Key)文件,该密钥编码后的内容(ASCII Armor)可以直接从地址“https://packages.microsoft.com/keys/microsoft.asc”下载。为了在本地注册该密钥文件,我们执行如下的命令下载该文件并执行“gpg --dearmor”将文本内容转换成二进制保存在文件“microsoft.gpg”,最终将后者保存到受信任密钥目录“/etc/apt/trusted.gpg.d”下。
~$ curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
~$ sudo mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg
完成针对签名密钥文件的注册之后,我们可以执行如下命令将在表示deb包源的“/etc/apt/sources.list.d”目录下创建一个dotnetdev.list文件,.NET Core SDK所在deb包对应的Feed URL(https://packages.microsoft.com/repos/microsoft-ubuntu-xenial-prod)就包含在这个文件中。在这之后微软通过该Feed提供的所有的deb包都可以直接通过apt-get命令安装。
~$ sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-xenial-prod xenial main" > /etc/apt/sources.list.d/dotnetdev.list'
当所在deb包的Feed被成功注册并通过执行apt-get update命令作相应同步操作之后,我们就可以按照如下的方式执行apt-get install命令安装.NET Core SDK了。值得一提的时候,如果你在本地曾经安装过之前的版本,你最好先将它们卸载。
~$ sudo apt-get update
~$ sudo apt-get install dotnet-sdk-2.0.0
安装完成之后,我们可以执行dotnet –info命令查看当前.NET Core SDK的基本信息,如果得到如下图所示的输出结果,那就证明.NET Core SDK被成功安装。
三、利用命令行创建一个ASP.NET Core MVC应用
.NET Core SDK同样为Linux提供了dotnet这个重要的命令行工具,意味着这我们同样可以利用它提供的脚手架模板创建相应的.NET Core应用。这次我们直接创建一个ASP.NET Core MVC,为此我们在执行dotnet new命令得时候将模板名称指定为“mvc”。如下图所示,我们在执行dotnet new命令时的当前工作目录为“/mnt/c/”,也就是主系统Windows下的“c:”,所以创建出来的ASP .NET Core MVC应用所在的根目录为“c:helloworld”,我们列了该目录下的所有文件和子目录。如果我们在Windows下执行相同的命令创建一个ASP.NET Core MVC命令,它也具有相同的目录结构和文件内容。
和在Windows和Mac OS X下利用脚手架命令创建的应用一样,我们在Linux下同样可以在无需对它们作任何更改的情况下直接运行它们,为此我们只需要在当前应用所在的目录下执行dotnet run命令即可。如下图所示,启动后的ASP .NET Core MVC应用默认会绑定在5000端口进行请求监听,由于Linux是当前Windows的子系统而非虚拟机,所以主子系统可以共享网络,因此我们利用浏览器请求地址“http://localhost:5000”可以访问这个应用的主页。
- c# asp.net 实现分页(pager)功能
- 一次数据库无法登陆的"问题"及排查(r2第11天)
- popcorn-js视频Video框架简单用法
- 一次数据库响应缓慢的问题排查(r2第9天)
- 通过Ajax方式上传文件(input file),使用FormData进行Ajax请求
- C# 读取指定文件夹下所有文件
- ASP.NET 实现Base64文件流下载PDF
- MVC自定义视图引擎地址
- JS禁止鼠标右键、禁止全选、复制、粘贴的方法(所谓的防盗功能)
- impdp异常中断导致的问题(r2第8天)
- 利用autocomplete.js实现仿搜索效果(ajax动态获取后端[C#]数据)
- sql语句的简化(r2第7天)
- Ajax jsonp 跨域请求实例
- asp.net动态解析用户控件(UserControl)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- poiAndEasyExcel学习(五)
- 两分钟真能搞懂桶排序
- SpringMVC文件上传下载
- 学弟不懂原码反码补码,气的我给女朋友讲了一夜
- 使用 HanLP 统计二元语法中的频次
- 算法集锦(13)|自然语言处理| Python代码的语义搜索引擎创建
- 特征锦囊:彻底了解一下WOE和IV
- Nginx专辑|05 -如何使用Nginx配置正向代理
- 详解 SIGHAN05 的目录结构
- 工业数据分析之数据归一化 | 冰水数据智能专题 | 2nd
- python写的小程序
- 不求甚解之 Spanning Tree
- C语言常用的一些转换工具函数收集
- OpenAI Gym入门级导游 | 附PDF手册下载 | 山人刷强化 | 4th
- python中常见关于Excel表格读写操作