前言

在博客园看到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. Bootstrap IIFE

    在Bootstrap源码(具体请看<Bootstrap源码解析>)和其他jQuery插件经常看到如下的写法: +function ($) { }(window.jQuery); 这种写法称 ...

  2. [CQOI2011]动态逆序对

    (又是一道树套树……自己真是玩疯了……) (题意略) 从网上也看过题解,好像解法很多……比如CDQ+树状数组,树状数组套主席树,树状数组套平衡树……我用的是树状数组套splay. (我会说是因为我不会 ...

  3. 9.3---魔术索引(CC150)

    魔术索引1:此外下一次应该看看课本上的方法. public boolean findMagicIndex(int[] A, int n){ for(int i = 0; i < A.length ...

  4. Genymotion自动化启动

      一.启动方式 命令行: player.exe --vm-name [模拟器名称]   例子: "D:\Program files\Genymobile\Genymotion\player ...

  5. Ext 下拉列表模糊搜索

    /** * Created by huangbaidong on 2016/9/18. * 楼盘通用Combo组件,支持模糊查询 * 使用案例: * { fieldLabel : '楼盘名称', xt ...

  6. EXT Grid 默认展开所有行

    grid.getStore().load({ //默认展开所有行. callback:function() { var expander = grid.plugins[0]; var count = ...

  7. iOS学习之UINavigationController详解与使用(一)添加UIBarButtonItem

    http://blog.csdn.net/totogo2010/article/details/7681879 1.UINavigationController导航控制器如何使用 UINavigati ...

  8. 【架构】How To Use HAProxy to Set Up MySQL Load Balancing

    How To Use HAProxy to Set Up MySQL Load Balancing Dec  2, 2013 MySQL, Scaling, Server Optimization U ...

  9. iOS UILocalNotification 每2周,每两个月提醒

    iOS 的UILocalNotification提醒提供了默认的重复频率,比如,一天,一个星期等等,但是对于非标准的频率,比如每,2周,每2个月,无法重复提醒. 我们的思路是在应用程序开始时,把即将发 ...

  10. Effective C++ -----条款16:成对使用new和delete时要采取相同形式

    如果你在new表达式中使用[],必须在相应的delete表达式中也使用[].如果你在new表达式中不使用[],一定不要在相应的delete表达式中使用[].