使用基于Node.js的构建工具Grunt来发布ASP.NET MVC项目


Posted in Javascript onFebruary 15, 2016

Grunt 简介
Grunt是一款基于js和node.js的构建工具,由于这段时间node.js越来越火爆,grunt拥有丰富的开源社区支持,产生了很多插件。还有一些插件散落在node社区。构建是一个和宽泛的表述,传统理解就是编译、打包、复制,而今,随着技术越来越丰富,构建还包括对前端组件的预处理,比如sass、less预处理成css,css和js的压缩和合并。grunt的插件可以很好的支持这些新的构建概念,而且更为适合用开源技术堆砌的项目。 虽然Grunt更多的用于程序构建,但是本质上Grunt是一个用来解决重复劳动的任务运行工具。

Grunt入门
安装
下载安装Node.js。下载地址

检查安装和查看版本:

node -v
v0.10.25

安装grunt命令行工具grunt-cli,使用-g全局安装,这样可以在任何一个目录里使用了。下面这条命令会把 grunt 加入你的系统搜索路径中,所以在任何目录下都可以使用此命令。

npm install -g grunt-cli

需要注意的是在linux或mac下有时会报没有权限的错误,这时须在前面加一个sudo

sudo npm install grunt-cli -g

查看版本:

grunt ?version
grunt-cli v0.1.13

卸载。如果你在之前安装过全局的 Grunt,那么先删除它。

npm uninstall -g grunt

grunt-cli只是一个grunt的命令行界面,需要使用grunt及其插件,必须在项目的路径(通常是项目根目录下)下安装grunt模块本身即需要插件模块。每当grunt命令被执行时,它会通过nodejs的require命令在本地寻找已经安装的grunt。正因为如此,你可以在任何子目录下运行grunt命令。 如果cli找到了一个本地安装的grunt,它会加载这个 grunt 库,然后应用你在 GruntFile 中写好的配置, 然后执行相应的任务。

配置文件
package.json
package.json用来保存当前目录下所安装和需要的node模块有哪些,例如:

{
 "name": "my-project-name",
 "version": "0.1.0",
 "author": "Your Name",

 "devDependencies": {
 "grunt": "~0.4.1"
 }
}

可以手动创建这个文件,或者通过npm init命令,并按照提示完成package.json文件的创建。如果手动创建了package.json,只需通过npm install来下载和安装所需的模块。模块安装时,会保存在node_modules目录中。

如果想要在之后添加所需模块,使用下面这个命令,可以使得package.json文件得到同步更新

npm install <module> --save-dev

Gruntfile.js
这个文件的地位就像Makefile一样,是一个指导grunt进行任务的文件,其中需要配置各个插件模块所需的参数,以及加载插件,并定义任务。更多关于Gruntfile可以参考这里。建议读者对Gruntfile有个整体的理解再继续。

使用Grunt构建ASP.NET MVC
MSbuild
在使用grunt来构建.NET项目之前,必须先了解MSbuild。MSBuild是微软的用来构建程序的工具,目前VisualStudio已经全面使用MSbuild编译项目了。MSbuild由一个msbuild工具、一组编译或构建器程序和xml文件组成。实际上VisualStudio中的.sln和.csproj等项目文件就是一个msbuild能够认识的xml(下面称为msbuild配置文件),VisualStudio通过调用msbuild,由msbuild识别其中的参数和构建行为标识来完成构建工作。我们也可以自己通过命令行自己来调用msbuild。

在msbuild中有两个关键的概念:Task和Property。Task是msbuild能够直接作为目标来执行的入口,在执行msbuild的时候要么指向默认的Task,否则必须指定目标Task是什么。Property就是变量,就像程序中的变量可以影响程序执行一样,Property可以影响构建的行为。

VisualStudio产生msbuild配置文件其实非常复杂,表面上看只有没有多上行,但是它通过import,将一些预定义的配置文件导入到当前文件,使得无法全面的查看完整的配置文件,以至于无法找到关键的Task项。好在有一个工具可以用来帮助分析msbuild配置文件的结构。

另外,在调用msbuild的时候,可以通过命令行参数来覆盖默认的属性和任务,比如下面的调用表示,以”Rebuild”这个Task作为目标,并将Configuration属性设置为Debug:

msbuild ConsoleApplication1.csproj /target:Rebuild /property:Configuration=Debug

更多关于msbuild,请参考微软的文档

手动使用msbuild代替VisualStudio
以发布到本机为例,经过笔者在VS2012下的环境中测试,使用VS在调用msbuild时使用了如下关键的参数覆盖:

  • Configuration:Debug或者Release,相信使用VS的同学对此不会陌生
  • VisualStudioVersion:VS在安装的时候会将一些公用的,VisualStudio相关的,msbuild配置文件预先存在某个版本相关的地方,在VisualStudio生成项目文件时,会包含一个$VisualStudioVersion变量,这个变量会与路径结合指向这些预先准备好的配置文件。在2012下,需要将这个值设置为11.0
  • WarningLevel:编译时的告警级别
  • DeleteExistingFiles:发布功能使用到的是否删除已存在文件的选项
  • WebPublishMethod:发布方式,笔者常用的是FileSystem,即发布到本机或远程共享的某个目录
  • publishUrl:如果WebPublishMethod是FileSystem,这个值表示发布的磁盘路径

关键的任务:

  • Build:即VS中针对某个项目的编译功能
  • Rebuild:即VS中针对某个项目的重新编译功能
  • WebPublish:即VS针对某个项目的发布功能

至此,我们已经可以使用msbuild命令行来代替VS的一些构建动作了。由于本篇的重点是grunt,读者可以参见微软的说明,自己试验一下:

PS: MSbuild通常位于类似这样的目录下:C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe
使用grunt-msbuild调用msbuild
终于到了介绍本文的主角了:grunt-msbuild。这是一个个人开发的msbuild调用中间件。作为grunt的插件,经过笔者亲测,完全可以使用。结合其他的grunt插件,简化了笔者发布项目的过程。

你可以像下面这样将这个插件添加进项目的Gruntfile,实现自动发布:

msbuild: {
  fontend: {    
    src: ['Web.FontEnd/Web.FontEnd.csproj'],
    options: {
      projectConfiguration: 'Release',
      targets: ['WebPublish'],
      stdout: true,
      maxCpuCount: 4,
      buildParameters: {
        WarningLevel: 2,
  VisualStudioVersion: "11.0",
  DeleteExistingFiles: 'True',
  WebPublishMethod: 'FileSystem',
  publishUrl: [font_pwd]
      },
      verbosity: 'quiet'
    }
  }
}

上面的代码实现了,将Web.FontEnd.csproj项目在Release模式下通过FileSystem发布方式发布到font_pwd变量指代的目录下。 这里需要注意的是,可能需要根据自己的VS版本修改VisualStudioVersion参数,可以通过查看类似如下目录:C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0来检查。font_pwd是一个js变量,根据需要进行调整。

Grunt的完整配置就不给出了,主要是要知道这几个关键的参数设置。

在实际使用过程中DeleteExistingFiles这个参数似乎不起作用,所以可能需要另外再包含清空目标文件夹的任务。下面是实际任务运行时的部分截图:

使用基于Node.js的构建工具Grunt来发布ASP.NET MVC项目

Javascript 相关文章推荐
jquery ajax例子返回值详解
Sep 11 Javascript
dwz 如何去掉ajaxloading具体代码
May 22 Javascript
document.write()及其输出内容的样式、位置控制
Aug 12 Javascript
Js使用WScript.Shell对象执行.bat文件和cmd命令
Dec 18 Javascript
jQuery验证插件validation使用指南
Apr 21 Javascript
ECMAScript中函数function类型
Jun 03 Javascript
JavaScript中的replace()方法使用详解
Jun 06 Javascript
javascript禁止超链接跳转的方法
Feb 02 Javascript
深入理解JavaScript定时机制
Oct 27 Javascript
jquery实现折叠菜单效果【推荐】
Mar 08 Javascript
Vue2.0用户权限控制解决方案的示例
Feb 10 Javascript
集成vue到jquery/bootstrap项目的方法
Feb 10 jQuery
JavaScript模版引擎的基本实现方法浅析
Feb 15 #Javascript
在ASP.NET MVC项目中使用RequireJS库的用法示例
Feb 15 #Javascript
一道常被人轻视的web前端常见面试题(JS)
Feb 15 #Javascript
获取阴历(农历)和当前日期的js代码
Feb 15 #Javascript
极易被忽视的javascript面试题七问七答
Feb 15 #Javascript
在JavaScript中使用JSON数据
Feb 15 #Javascript
三分钟带你玩转jQuery.noConflict()
Feb 15 #Javascript
You might like
php不用正则验证真假身份证
2013/11/06 PHP
PHP获取中英混合字符串长度的方法
2014/06/07 PHP
深入理解PHP中的count函数
2016/05/31 PHP
php  PATH_SEPARATOR判断当前服务器系统类型实例
2016/10/28 PHP
php中this关键字用法分析
2016/12/07 PHP
JavaScript字符串插入、删除、替换函数使用示例
2013/07/25 Javascript
减少访问DOM的次数提升javascript性能
2014/02/24 Javascript
在JavaScript的正则表达式中使用exec()方法
2015/06/16 Javascript
JavaScript实现点击按钮字体放大、缩小
2016/02/29 Javascript
基于jQuery实现音乐播放试听列表
2016/04/14 Javascript
JavaScript中清空数组的三种方式
2017/03/22 Javascript
JS Object.preventExtensions(),Object.seal()与Object.freeze()用法实例分析
2018/08/25 Javascript
vue构建动态表单的方法示例
2018/09/22 Javascript
js获取form表单中name属性的值
2019/02/27 Javascript
浅谈目前可以使用ES10的5个新特性
2019/06/25 Javascript
js实现贪吃蛇小游戏(加墙)
2020/07/31 Javascript
可拖拽组件slider.js使用方法详解
2020/12/04 Javascript
pycharm 使用心得(七)一些实用功能介绍
2014/06/06 Python
利用Python爬取可用的代理IP
2016/08/18 Python
Python实现的三层BP神经网络算法示例
2018/02/07 Python
使用npy转image图像并保存的实例
2020/07/01 Python
Python用来做Web开发的优势有哪些
2020/08/05 Python
canvas烟花特效锦集
2018/01/17 HTML / CSS
英国工具中心:UK Tool Centre
2017/07/10 全球购物
GOLFINO英国官网:高尔夫服装
2020/04/11 全球购物
航空大学应届生求职信
2013/11/10 职场文书
新闻系毕业生推荐信
2013/11/16 职场文书
大客户销售经理职责
2013/12/04 职场文书
模具专业毕业生自荐书范文
2014/02/19 职场文书
超市理货员岗位职责
2014/07/04 职场文书
四风问题个人对照检查剖析材料
2014/09/27 职场文书
2014年维稳工作总结
2014/11/18 职场文书
音乐会主持人开场白
2015/05/28 职场文书
对公司的意见和建议
2015/06/04 职场文书
2016秋季运动会开幕词
2016/03/04 职场文书
解决golang 关于全局变量的坑
2021/05/06 Golang