没有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(运行示例)
- Clone the ASP.NET Core Home repository: https://github.com/aspnet/home(Clone ASP.NET Core/Home的仓库)
- Change directory to the folder of the sample you want to run(在命令行窗口中更改目录到你想要运行的示例代码所在的文件夹中)(译者注:示例有多个,可以随意选择其中一个感兴趣的)
- Run
dnu restoreto restore the packages required by that sample.(运行dnu restore命令来恢复那个例子所必需的包) - You should see a bunch of output as all the dependencies of the app are downloaded from MyGet.(你应该会看到一堆输出信息,同时应用程序所有的依赖包都从NuGet中下载下来)
- 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)
- For the console app run
- You should see the output of the console app or a message that says the site is now started.(你应该看到控制台程序的输出信息,或者看到一条消息告诉你网站现在已经启动了)
- 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的更多相关文章
- VisualStudio 怎么使用Visual Leak Detector
VisualStudio 怎么使用Visual Leak Detector 那么在Windows下有什么好的内存泄漏检测工具呢?微软提供Visual Studio开发工具本身没有什么太好的内存泄漏检测 ...
- [2017-08-07]ABP系列——QuickStartA:概述、思想、入门和HelloWorld
唔,说好的文章,欠了好久,先水一篇. 本系列目录:Abp介绍和经验分享-目录 概述 先表个态:对绝大多数人来说,ABP是成熟的,足以用到生产环境的. 最适合的:业务非常复杂且不追求极致性能的(这里并不 ...
- ReactNative之从HelloWorld中看环境搭建、组件封装、Props及State
开篇呢,先给大家问个好,今天是中秋节,祝大家中秋节快乐!!虽然是中秋节,但是木有回家还是总结一下知识点写写博客吧,想着昨天总结一下的,但是昨天和几个同学小聚了一下,酒逢知己总是千杯少呢,喝的微醺不适合 ...
- 学习go语言编程系列之helloworld
1. 下载https://golang.org/dl/ # Go语言官网地址,在国内下载太慢,甚至都无法访问.通过如下地址下载:https://golangtc.com/download. 2. 安装 ...
- 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 ...
- 使用webstorm+webpack构建简单入门级“HelloWorld”的应用&&引用jquery来实现alert
使用webstorm+webpack构建简单入门级"HelloWorld"的应用&&构建使用jquery来实现 1.首先你自己把webstorm安装完成. 请参考这 ...
- Idea下用SBT搭建Spark Helloworld
没用过IDEA工具,听说跟Eclipse差不多,sbt在Idea其实就等于maven在Eclipse.Spark运行在JVM中,所以要在Idea下运行spark,就先要安装JDK 1.8+ 然后加入S ...
- VisualStudio 2015 开启IIS Express可以调试X64项目
现在项目开发时总有时需要在X64下开发,这样我们就需要IIS Express中调试.不要总是放在IIS中,在Attach这样好慢. 如果不设置直接调试X64的程序,我们有可能会受到以下类似的错误 ...
- 自定义可视化调试工具(Microsoft.VisualStudio.DebuggerVisualizers)
前言: 最近飞机失联的太多,明天要飞北京处理服务器双机热备的问题,航空保险已买,单号是:TF10122913. 至于我的银行卡密码,在我枕头下面的字条里,要是我之后没再更新文章,请通知我家人,哈哈哈哈 ...
随机推荐
- POJ 1273 网络流(最大流)模板
http://poj.org/problem?id=1273 这道题很值得反思,弄了一下午,交上去先是一直编译错误,而在本地运行没有问题, 原因可能是oj的编译器版本老旧不支持这样的写法 G[from ...
- django 操作数据库--orm(object relation mapping)---models
思想 django为使用一种新的方式,即:关系对象映射(Object Relational Mapping,简称ORM). PHP:activerecord Java:Hibernate C#:Ent ...
- Python连接MySQL的准备工作
首先要安装MySQL,64位的win7可以安装64或者32位的MySQL版本,安装之后,python需要一个工具才能连接MySQL,这个工具叫MySQL-python,去这里或者这里下载1.2.3版本 ...
- 使用WITH AS提高性能简化嵌套SQL
一.WITH AS的含义 WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到.有的时候,是为了让 ...
- ios delegate 使用注意 assign,weak
今天一个同事写代码,把一个delegate对象设定成了assign类型属性,没有用weak,就是delegate对象释放后,不会把delegate指针自动设定为nil,把对象的delegate设定成了 ...
- C# Winfrom 页面传值
2个窗体 Parent,Children 代码: Parent public partial class Parent : Form { public string parentValue = &qu ...
- MySQL 通过idb文件恢复Innodb 数据【转】
昨晚收到一则求助,一个用户的本地数据库的重要数据由于误操作被删除,需要进行紧急恢复,用户的数据库日常并没有进行过任何备份,binlog也没有开启,所以从备份和binlog入手已经成为不可能,咨询了丁奇 ...
- glib-2.49.4-msys-x86-staticLib.7z
glib-2.49.4 MSYS 静态库 编译 export LIBFFI_CFLAGS=" -I/usr/local/lib/libffi-3.2.1/include " \ e ...
- MPlayer-2016-bin-noConsole
运行 Install-RMenu.cmd 添加右键播放功能 ; 往前0.05秒 大概10多个帧 ' 往后0.05秒 大概10多个帧 鼠标右键 快速定位 鼠标中键 退出 F1 缩小 F2 原始大小 F3 ...
- 日历插件My97DatePicker的使用
在开发过程中,我们会经常遇到让用户输入日期的表单,这类表单处理起来也不是太繁琐,就是简单的字符串和日期之间的转换.但是,如果用户不按照已设定的日期格式进行输入,必定会造成不必要的麻烦.为了更好的处理这 ...