没有VisualStudio也要HelloWorld

前言

在博客园看到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大神的地方都加上了他的博客地址链接,方便新来园子的童鞋可以方便地学习他的教程。

posted @ 2016-04-07 00:54  守护晴天  阅读(351)  评论(0编辑  收藏  举报