前言

在博客园看到Artech通过3个Hello World应用来了解ASP.NET 5应用是如何运行的(1)这篇文章,于是想跟着教程学习一下。说来惭愧,这篇文章发布于2014年12月,我在2016年4月才开始学习,晚矣晚矣。

遇到困难

这篇文章中介绍如何不用Visual Studio来编写代码,执行编译并运行。其中介绍了KRE和KVM,K是项目代号,RE是运行时环境,而VM是版本管理器,也就是管理不同版本的运行时环境。其实这就是微软的一套SDK,之前微软也是有的,只不过现在把原来的执行机制给做了改动。现在的项目不是必须要有项目文件来做代码文件的组织与关联,而是通过文件夹和json格式的配置文件。正如这篇文章所说,一个目录就是一个项目,但是要想成为项目的目录,需要有几个条件。首先,目录中必须有project.json文件;其次,作为一个应用,必须要有程序入口点——具有一个名为Program的类,且该类中有一个名为Main的方法。我按照他给出的示例代码完成了对应的2个文件,接下来就是安装KVM,升级KVM,执行K run命令。结果第一步就卡住了,报错了,这也是我这次经历中最大的困难。错误大意是在向远程服务器发送请求时一个参数出错了,我有点不确定Artech给的是不是命令,于是放到PowerShell中当成脚本来执行,结果报错的信息显示我做得更离谱了,后来查到需要用管理员身份权限运行命令行窗口,于是再试,错误依旧。无奈之下只好求助必应,查到GitHub上的一个页面,说明文档给出的命令与Artech文章中的命令一模一样,这是什么问题呢?

踏破铁鞋

由于是微软的技术,因此也不必FQ问谷哥,直接就是stackoverflow+github+asp.net,终于在asp.net中翻到一篇博客,里面原文片段如下:

Update: Now everything is renamed to dotnet. http://www.hanselman.com/blog/ExploringTheNewNETDotnetCommandLineInterfaceCLI.aspx
Update: In the current version, k/klr become dnu, kre become dnx(.NET corss-platformform run-time environment), kvm become dnvm and kpm become dnu. Details https://github.com/aspnet/Announcements/issues/4

这篇文章写的是K、KVM、KPM、KLR、KRE这几个东东,但是在文章最开始却写了这2个更新。第一个是:现在一切都改名为dotnet了,具体请看Hanselman的一篇博客;第二个是:在当前(指最新的)的版本中,k/klr变成了dnu(感觉这个应该变成了dotnet),kre变成了dnx(.NET跨平台运行时环境),kvm变成了dnvm,而kpm变成了dnu,详细的内容请参考asp.net在github上的一个issue。
这下基本确认了为啥报错,因为kvm取消了,现在都变成了dnvm,所以下载的命令在请求服务器时就出错了。当然这个问题我在评论中也给Artech留言了,希望能得到证实,毕竟我的技术还不够好,我的英文水平还不够高,而对待学问应该是严谨的。而且在Hanselman的博客文章中,里面提到,如果你安装了vs2015,dnvm会自动安装,我勒个去,忙了半天,我的电脑里已经有了,于是命令行中输入dnvm,果然出现了帮助文档。
这里还有一些相关的命令,比如dnvm upgrade(原来的kvm upgrade)、dnvm list、where dnvm、dnx run(也就是原来的k run)、dnu restore(这个命令也挺有意思的,后文说),因为我安装了VS IDE,所以自动带了dnvm。如果机器上压根就没有dnvm,那么安装dnvm的命令行命令也有,ps脚本也有,这两个在asp.net的github上的说明文档中可以查到。

我的第81难

github上的说明文档,还给出了示例运行的步骤。我按照步骤一路向西走去,最后到了佛祖面前,他把经书给了我,而且还是两卷:一个是运行控制台程序,直接dnx run,另一个是运行asp.net程序,执行dnx kestrel,然后到浏览器中执行localhost+指定端口号。我拿着到手的经书喜滋滋地在命令行窗口中按下了回车键,结果如唐僧所言,经书上没字,我的是报错了!错误信息说当前目标框架451与项目不匹配,当前版本列表中有1.0.0-beta5,也有1.0.0-rc1-update1,甚至在我执行完dnvm upgrade后还有1.0.0-rc1-update2,运行时有clr,也有coreclr。我知道新的.NET版本号都改为了1.0.0,但是老的完整功能的版本依然在更新4.5、4.5.1、4.6等等,但是我版本列表中没有451啊(这里“有没有”是指dnvm管理的版本,其实我的机器上肯定有4.5.1甚至是4.6),我想着执行dnvm install dnx451,失败了,提示我不能下载包,远程服务器返回400错误。这也不知道是我的命令写错了,还是家里网络有问题而连不到某些服务器,还是其他原因。难道就真的不行了吗?Hello World出不来了吗?

取得真经

我的代码很简单,没有什么依赖,运行起来不应该有太多的障碍。根据Artech的文章所说,为了简便,project.json文件中什么都不用写,而我在无意中执行dnu restore命令时,自动生成了一个project.lock.json的文件,里面的配置项不是空的。之前我在VS2015中尝试MVC6时,有次出现过某个问题,网上给出的解决办法就是,把project.lock.json文件删掉,重新执行restore(VS2015中的restore是自动执行的,不用任何操作,一般可能在文件有更改或生成项目/解决方案时)。我就想project.json是配置文件,我能不能在这个文件里指定版本号呢?曾经在MVC6模版项目中的project.json里看到frameworks配置项,于是就仿照添加了一个,frameworks的值是一个对象,dnx451是这个对象的一个属性的键名,对应的值是空对象。然后再dnu restore,生成的lock文件中多了一个DNX,Version=v4.5.1,执行dnx run,这次没有报错信息,我仔细一瞧,Hello World在dnx run那行的下面静静地躺着,丝毫不起眼、不引人注目。至此,我长出一口气,终于搞定了,不过冷静一下,发现自己才刚刚开始,接下来如何运行复杂的asp.net程序,如何在linux系统上跑起来,与这些一比,今天的经历实在不够看的。

结尾

如果你想用文本编辑器写代码,用命令行来编译并运行程序(有个术语叫CLI),入门方法可以参照这篇——那是不行的,因为这篇是记录我解决问题的历程,这些问题可能你不会遇到。
我推荐就是github上的步骤,如下:
Running the samples(运行示例)

  1. Clone the ASP.NET Core Home repository: https://github.com/aspnet/home(Clone ASP.NET Core/Home的仓库)
  2. Change directory to the folder of the sample you want to run(在命令行窗口中更改目录到你想要运行的示例代码所在的文件夹中)(译者注:示例有多个,可以随意选择其中一个感兴趣的)
  3. Run dnu restore to restore the packages required by that sample.(运行dnu restore命令来恢复那个例子所必需的包)
  4. You should see a bunch of output as all the dependencies of the app are downloaded from MyGet.(你应该会看到一堆输出信息,同时应用程序所有的依赖包都从NuGet中下载下来)
  5. Run the sample using the appropriate DNX command: (使用合适的DNX命令来运行例子)
    • For the console app run dnx run .(对于控制台程序运行dnx run
    • For the web apps run dnx kestrel .(对于web程序运行dnx kestrel
  6. You should see the output of the console app or a message that says the site is now started.(你应该看到控制台程序的输出信息,或者看到一条消息告诉你网站现在已经启动了)
  7. You can navigate to the web apps in a browser by navigating to http://localhost:5004 (你能在浏览器中通过访问http://localhost:5004地址来浏览web应用程序)

补充

昨天写得太晚,忘记了感谢。能解决我的问题并写出这篇文章,首先感谢Artech大神,这是他的博客,强烈推荐大家去学习。另外在“踏破铁鞋”章节说到,在评论中给他留言以求证实,幸运的是大神给我回复了,很开心啊有木有!以下为Artech大神的回复原文:

你说的都是“淘汰”的产品:)
连DNX都要替换成CLI了,你可以等RC2出来再学!

其次还要感谢那个告诉我的KVM更名的大神,应该是国外的网友,他的博客是在asp.net网站上,同时也要感谢Hanselman,这个大神比较高端,我不是很熟悉。
最后感谢ASP.NET团队及其他们的开源工作,他们在GitHub上所做的努力,使得一些问题解决起来要方便很多。
今早的更新对原文没做改动,只是增加了“补充”这个章节,并且把原文提到Artech大神的地方都加上了他的博客地址链接,方便新来园子的童鞋可以方便地学习他的教程。

没有VisualStudio也要HelloWorld的更多相关文章

  1. VisualStudio 怎么使用Visual Leak Detector

    VisualStudio 怎么使用Visual Leak Detector 那么在Windows下有什么好的内存泄漏检测工具呢?微软提供Visual Studio开发工具本身没有什么太好的内存泄漏检测 ...

  2. [2017-08-07]ABP系列——QuickStartA:概述、思想、入门和HelloWorld

    唔,说好的文章,欠了好久,先水一篇. 本系列目录:Abp介绍和经验分享-目录 概述 先表个态:对绝大多数人来说,ABP是成熟的,足以用到生产环境的. 最适合的:业务非常复杂且不追求极致性能的(这里并不 ...

  3. ReactNative之从HelloWorld中看环境搭建、组件封装、Props及State

    开篇呢,先给大家问个好,今天是中秋节,祝大家中秋节快乐!!虽然是中秋节,但是木有回家还是总结一下知识点写写博客吧,想着昨天总结一下的,但是昨天和几个同学小聚了一下,酒逢知己总是千杯少呢,喝的微醺不适合 ...

  4. 学习go语言编程系列之helloworld

    1. 下载https://golang.org/dl/ # Go语言官网地址,在国内下载太慢,甚至都无法访问.通过如下地址下载:https://golangtc.com/download. 2. 安装 ...

  5. ITK Configuring and Building in VisualStudio及hello world程序编译

    1. ITK Configuring and Building in VisualStudio With Visual Studio 2010 on Windows 7 (32-bit): Launc ...

  6. 使用webstorm+webpack构建简单入门级“HelloWorld”的应用&&引用jquery来实现alert

    使用webstorm+webpack构建简单入门级"HelloWorld"的应用&&构建使用jquery来实现 1.首先你自己把webstorm安装完成. 请参考这 ...

  7. Idea下用SBT搭建Spark Helloworld

    没用过IDEA工具,听说跟Eclipse差不多,sbt在Idea其实就等于maven在Eclipse.Spark运行在JVM中,所以要在Idea下运行spark,就先要安装JDK 1.8+ 然后加入S ...

  8. VisualStudio 2015 开启IIS Express可以调试X64项目

    现在项目开发时总有时需要在X64下开发,这样我们就需要IIS Express中调试.不要总是放在IIS中,在Attach这样好慢.   如果不设置直接调试X64的程序,我们有可能会受到以下类似的错误 ...

  9. 自定义可视化调试工具(Microsoft.VisualStudio.DebuggerVisualizers)

    前言: 最近飞机失联的太多,明天要飞北京处理服务器双机热备的问题,航空保险已买,单号是:TF10122913. 至于我的银行卡密码,在我枕头下面的字条里,要是我之后没再更新文章,请通知我家人,哈哈哈哈 ...

随机推荐

  1. 7.4---加法替代运算(CC150)

    注意:1,除法那里b+=b是错的.b一直在改变.   2,仔细一点. import java.util.*; public class AddSubstitution { public int cal ...

  2. apscheduler 绿色版

    由于依赖EntryPoint,因此apscheduler在离线的方式(直接拷贝然后引用)使用时,会报错. 错误信息类似: No trigger by the name “interval/cron/d ...

  3. MySQL客户端Workbench

    MySQL客户端除了Navicat之外,还有官方推出的MySQL Workbench,能看到数据库包含的存储过程,而Navicate不能. 下载链接: 32位:http://cdn.mysql.com ...

  4. CDN——到底用还是不用?

    最近在学bootstrap,在知乎上搜索bootstrap看到有人问bootstrap基础包体积较大,对性能影响会不会很大,看到两种方法来减少对性能的影响: 有选择地部分加载,bootstrap带有L ...

  5. 第十天 多进程、协程(multiprocessing、greenlet、gevent、gevent.monkey、select、selector)

    1.多进程实现方式(类似于多线程) import multiprocessing import time,threading def thread_run():#定义一个线程函数 print(&quo ...

  6. iOS CoreData relationship 中的inverse

    官方文档建议为每一个可以设置inverse的relationship设置一个inverse.目的是保持数据库的正确性.但是没有具体的说明. 我在stackoverflow中找到了一个是分好的答案,ht ...

  7. vc++创建文件目录

    #include "stdafx.h" #include <iostream> #include <fstream> #include <string ...

  8. ACM/ICPC 之 数论-素数筛选法 与 "打表"思路(POJ 1595)

    何为"打表"呢,说得简单点就是: 有时候与其重复运行同样的算法得出答案,还不如直接用算法把这组数据所有可能的答案都枚举出来存到一个足够大的容器中去-例如数组(打表),然后再输入数据 ...

  9. HttpWebRequest.GetResponse 方法

    GetResponse 方法返回包含来自 Internet 资源的响应的 WebResponse 对象. 实际返回的实例是 HttpWebResponse,并且能够转换为访问 HTTP 特定的属性的类 ...

  10. codeforces 425C Sereja and Two Sequences(DP)

    题意读了好久才读懂....不知道怎么翻译好~~请自便~~~ http://codeforces.com/problemset/problem/425/C 看懂之后纠结好久...不会做...仍然是看题解 ...