在上一篇文章中,老周扯了一下在 Windows 10 中开启 Linux 子系统,并且进行了一些简单的设置。本篇咱们就往上面安装 .net core 。
老周假设你从来没有用过 Linux,所以,接着上一次的博文,老周先给您介绍几个可能比较常用的东东。
切换到 root 用户上下文
当你启动 Ubuntu 子系统后,你会看到,在你的用户名、机器名、路径名后有个 $ 符号。如下图。
这表示当前用户的权限是受到限制的,如果想要执行某些需要高权限的命令(这个类似于 Windows 中的以管理员身份运行),你需要在命令前面加上 sudo,比如
sudo command....
举个例子,删除某个目录下的所有文件。
sudo rm -rf ~/bin/*
不过,有些命令,你加上 sudo 后仍然会提示权限不够,在不修改权限的情况下(一般来说最好不改)可以切换到 root 上下文,方法是输入
或者省略 root ,直接输入 su ,默认也会切换到 root 上下文。
这时会提示你输入 root 的密码,但这个密码现在是随机的,你并不知道它是什么。
所以,我们要为 root 设置一个密码,输入
sudo passwd root
现在,你先要输入你的密码,就是刚刚初始化 Ubuntu 时你输入的那个密码。
现在你可以为 root 设置密码了。
你还要确认一次密码。
现在,root 的密码就设置完成了。
输入 su 后,输入刚刚设定的 root 密码,就可以切换到 root 上下文了。
这个时候,你会发现,工作目录后面的 $ 符号已经变成 # 符号了,表示这是超级用户的上下文。
如何访问 Windows 目录和文件
这个 Linux 子系统的一个好处是可以直接访问 Windows 目录和文件,如果用于开发测试,比虚拟机方便很多。
访问Windows文件的一个最简单的方法,你可以在任何目录下执行 Powershell 或者 CMD,然后输入 bash 命令,就可以用当前目录来作为工作目录,并进入 Liunx 子系统。
第二种方法,在 Linux 子系统中,通过 /mnt 下面的路径来访问。用过安卓模拟器的朋友应该知道这个目录。
举个例子,我要进入 D 盘下的 Apps 目录,可以输入
cd /mnt/d/apps
再比如,下面命令可以列出 C 盘下的 Windows/System32中的文件。
ls /mnt/c/Windows/System32
要注意大小写啊,而且路径分隔符要用 /。
离线安装 .NET Core SDK
关于.net core sdk 的安装,你可以根据微软官方的教程,直接照抄即可,详细请看: https://www.microsoft.com/net/learn/get-started/linuxubuntu
这里老周介绍一下如何离线安装,因为有些阉割版 Linux 服务器连 yum 或 apt 都没有。前段时间用阿里云的一个 CentOS 6.5,想升级到 7.0,结果那王八居然没有 yum ,想手动安装,结果下载了一堆的 rpm 包,都装不上,很多依赖库都丢失,实在折腾不下去了,就找阿里的技术支持,把它们 fuck 了一顿。
想执行 dotnet 命令,你得装 SDK ,不能装 runtime,runtime 是用不了 dotnet 命令的。
离线安装的好处就是你可以事先下载好包,然后传到服务器上去。当然,也可以在服务器上直接下载,用 wget 命令下载。
先切换到临时目录。
cd /tmp
然后输入wget命令下载。
wget https://download.microsoft.com/download/1/1/5/115B762D-2B41-4AF3-9A63-92D9680B9409/dotnet-sdk-2.1.4-linux-x64.tar.gz
这个下载,还是挺花时间的,所以,你可以坐下来喝两杯茶。直到 100% 就表示下载完了。
如果下载到半路挂了不动,你可以按【Ctrl + C】,然后它会重试继续下载,直到下载为止。如果实在不行,你可以在Windows中用迅雷等工具下,然后复制进Linux 目录就行了,复制用 cp 命令
cp /mnt/c/Users/xxx/Downloads/dotnet-sdk-2.1.4-linux-x64.tar.gz /tmp/dotnet-sdk-2.1.4-linux-x64.tar.gz
现在 ls 一下,看看 tmp 目录下是不是有个压包。
其实这个是不用安装的,直接解压出来就可以耍。
1、切换到你当前的目录下,输入 cd ~
2、用 mkdir 命令创建一个 dotnet 文件夹。
mkdir dotnet
然后用 cd 命令进入 /tmp,就是刚才下载文件存放的目录。
cd /tmp
3、把刚刚下载的那个 tar.gz 包解压到 /home/你的用户名/dotnet 目录下。
tar -zxf dotnet-sdk-2.1.4-linux-x64.tar.gz -C ~/dotnet
-C 参数指定,解压出来的东西放到 /home/xxxx/dotnet 目录下,~/表示的就是 /home/用户名 目录。注意 -C 是大写字母!!!
- z表示用 gzip 算法处理文件,-x表示解压操作,-f是必须,表示你要操作的文件。上面的 -zxf是三个参数合起来使用,而且,-f 必须放到后面,因为 -f 后面必须指定文件名。最后 -C 指定工作目录。
大约等待十几秒,就解压完成了。
4、进入 /home/用户名/dotnet 目录。
cd ~/dotnet
然后用 ls 命令看看里面是否有东西。
然后,你可能会遇到这样的错误。
不要急,这是缺少了某个库导致,执行以下命令安装一下:
sudo apt install libunwind8
接着,你再执行一下:
~/dotnet/dotnet --info
如果看到以下内容,那恭喜发财,你的 .net SDK 可以正常运行了。
但是,你也发现了,执行 dotnet 命令很是不方便,路径太长。这时候你一定会想到,设置一下 PATH 环境变量。老周个人觉得嘛,不轻易改动环境变量是最好的方案,我们输入以下命令,看看 PATH 变量中都有哪些路径。
echo $PATH
输出内容如下。
于是,老周选择了 /home/zhou/bin,即 ~/bin。
用 cd ~ 切换到你的 home 目录下,然后 ls 一下,看看有没有 bin 目录。
显然是没有的,所以,创建一个 bin 目录。
mkdir bin
然后用 ln 创建一个符号链接,放到 bin 目录下,并且指向 dotnet/dotnet 文件。
ln -s ~/dotnet/dotnet ~/bin/dotnet
这样一来,你只需要执行 dotnet 就可以了。
在线安装 .NET Core SDK
其实官方的教程就是在线安装的,这里老周说一下另一种安装方法。
官方教程中用的是 apt-get 命令来安装的,其实我们可以用 apt 命令代替 apt-get。APT 是通过一系列的 source 来获取软件包的,这些source都是以后缀为 .list 的文件存放,主要在两个地方:
1)文件:/etc/apt/sources.list
2)目录:sources.list.d
一般来说,我们如果是自己定义的软件源,可以放到 sources.list.d 目录下,文件名以 .list 结尾。
默认情况下,sources.list 文件中的源都是 ubuntu 官方的,但是,国外的服务有时候很慢,有时候也经常挂,所以,我们不妨改为国内的源。国内的源可以网上找,老周一直都是用 163 的,优点是速度快。
方法是修改 sources.list 文件,你可以先进行备份,当然你不备份也行。要备份的话,可以用复制文件的命令。
先换到 apt 目录。
cd /etc/apt
然后
sudo cp sources.list sources.bak
这是系统目录,需要高的权限,所以要加上 sudo。
执行后,你就会看到备份的文件了。
接着,用 echo 命令把 sources.list 文件的内容清空。这时候你得 su 切换到 root 上下文,不然可能不让你写文件。
echo "" >sources.list
把空白字符串输出到文件中,就等于清空文件了,然后我们用 nano 来输入 163 的源,因为这个软件好像没有全选功能,反正老周是找不到可以全选的。
nano sources.list
然后,你每行一条,输入以下内容:
deb http://mirrors.163.com/ubuntu/ xenial main restricted universe multiverse deb http://mirrors.163.com/ubuntu/ xenial-security main restricted universe multiverse deb http://mirrors.163.com/ubuntu/ xenial-updates main restricted universe multiverse deb http://mirrors.163.com/ubuntu/ xenial-backports main restricted universe multiverse
有这四条就够了,还有一条是可选,因为它用于测试版的软件。
deb http://mirrors.163.com/ubuntu/ xenial-proposed main restricted universe multiverse
输完之后,按 Ctrl + O 保存,在提示的文件名处,保留 sources.list 不要改动,这样就会替换文件的内容了。最后按 Ctrl + X 退出。
修改完 sources.list 后,我们还要添加微软的软件源,以便在线安装。
输入
cd sources.list.d
进入 sources.list.d 目录,接着输入:
echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-xenial-prod xenial main" > my.list
这样就把源 URL 写入到文件中,文件名为 my.list,存放在 sources.list.d 目录下。
更改完源后,你要执行一下 apt update ,更新源列表,这是必须的。
从输出内容看到,微软的源也在其中了,但,你看清楚了,有这么一行。
这个错误是获取不到有效的签名,如果你按照官方的教程,先注册签名,是不会有此错误的,但因为此次并没有按官方的教程操作。
请把错误信息中 NO_PUBKEY 后面的那个字符串记下来,等一下会用到。
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EB3E94ADBE1229CF
最后面那个字符串就是从错误信息中记下来的,执行上面这一条命令后,签名就被导入了。
然后你再执行一次 apt update。
这样就成功更新源了。
接着你可以通过以下命令,看一下跟 dotnet sdk 有关的 package。
apt list | grep dotnet-sdk-*
上面命令中有个管道符号(|),它会把前一条命令的执行结果传递到第二条命令。apt list 命令用来获取 source list 中查询到的软件包,然后列出来。列出来的软件包列表就传给 grep 命令,grep 命令可以使用正则表达式来查找内容,此处咱们匹配所有以 dotnet-sdk- 开头的包。
过滤后的结果如下图所示。
目前,.net sdk 的最新版本是 2.1.4,我们安装最新版本即可。
安装软件包,使用 apt install <包名称>。咱们安装 2.1.4。
sudo apt install dotnet-sdk-2.1.4
如果你不执行 su 切换到 root 上下文,就要加上 sudo ,否则是没有权限安装的。
这时候它提示你,连同 SDK 一起安装的一堆软件包,并告诉你可能要占用 300 多MB的空间,然后问你是否安装。
如果你要安装,就输入 y 并回车,如果不想安装就输入 n 并回车。都走到这一步了,当然是要安装的了。
随后你就慢慢等吧,等它安装完成。
测试运行
启动 VS ,新建一个 ASP.NET Core 项目,假设项目名字叫做 MyApp。
然后让你选一个模板,对于 ASP.NET Core 项目,其实你选哪个模板都行,像什么 MVC ,什么 Web API,全部都是可以通过代码来开启,都是集成的,所以我说它比传统的 asp.net 要简单。
这里只为了验证,所以只选“空”模板就可以了。
等项目创建后,打开 Startup 类,找到 Configure 方法(注意,不是 ConfigureServices 方法,ConfigureServices 方法主要是开启应用程序的扩展功能的,你要用到什么就开启什么,比如 MVC),而 Configure 方法才是跟应用程序自身处理有关的,它通过各种称为“中间件”的玩意儿来处理 HTTP 请求。所谓中间件,你就理解为 HTTP 请求到达服务器后的各道“工序”,等所有中间件都对 HTTP 消息处理完毕后,就会返回给客户端(比如浏览器)。
把 Configure 方法改为以下代码。
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.Run(async (context) => { await context.Response.WriteAsync("这是一个很强大的应用。"); }); }
如果调用的是 app.Use 或者 app.UseXXX,就是作为中间件来处理 http 请求。Use 方法是直接通过一个委托来处理 HTTP 请求,一般用于简单的处理,比如只有两三行代码,如果处理比较复杂(例如一些自定义的验证方案),就可以写一个中间件类,然后插入消息处理队列中。
这里调用了 Run 方法,因为代码很简单,只是返回一个字符串,不需要经过 N 个工序,Run 方法使得消息处理“短路”,不分工序直接一步完成,就返回给客户端。
打开 Program 类,把 Main 方法改为。
public class Program { public static void Main(string[] args) { var hostBuilder = new WebHostBuilder(); // 构造 web host var host = hostBuilder.UseKestrel() .UseStartup<Startup>() .UseContentRoot(Directory.GetCurrentDirectory()) .UseUrls("http://localhost:7000") .Build(); // 运行 host host.Run(); } }
在构建 web host 时:
1、使用 Kestrel 作为 Server。
2、将当前目录作为应用的根目录。
3、在 7000 端口上监听客户端请求。
最后调用 Build 方法生成 host,所以你会看到,asp.net core 很灵活,很多功能你都可以随意增减。
在“解决方案资源管理”器窗口中,在项目节点上右击,从弹出的菜单中选择【发布】。
选择发布到文件夹。
发布后,打开发布目录,如下图所示。
然后以这个目录为工作目录,打开 Power shell 或CMD。
输入 bash 命令进入 Linux 子系统。输入:
dotnet MyApp.dll
注意文件名是区分大小写的。
看到以下信息,就说明 asp.net core 应用已经运行起来了。
打开浏览器,输入 http://localhost:7000,看看效果。
这时候你发现是乱码,可能你会想到在 Response.WriteAsync 方法调用时加上 Encoding 参数。
其实问题不是出在这里,而是出在 content-type 头上,所以,你应该加上:
app.Run(async (context) => { context.Response.ContentType = "text/plain;charset=utf-8"; await context.Response.WriteAsync("这是一个很强大的应用。"); });
重新发布一下。然后再次从浏览器访问,如下图所示。
好了,今天的内容就说到这里了,下一篇,老周介绍一下如何配置 nginx 服务器。