Grunt 入门指南5:项目脚手架
Project Scaffolding 項(xiàng)目腳手架
grunt-init
Grunt-init 是一個(gè)用來(lái)生成項(xiàng)目的腳手架工具. 它將基于當(dāng)前環(huán)境以及命令的問(wèn)答結(jié)果創(chuàng)建完整的項(xiàng)目目錄結(jié)構(gòu).實(shí)際生成的項(xiàng)目文件和內(nèi)容依賴于所選擇的模版以及問(wèn)答結(jié)果.
Installation 安裝
開(kāi)始使用grunt-init之前,你需要全局安裝grunt-init
npm install -g grunt-init安裝好后就可以在任意目錄使用grunt-init命令.
Usage 使用
- 使用grunt-init --help可以得到程序幫助以及可用的模版列表.
- 使用grunt-init TEMPLATE可以基于指定的模版生成項(xiàng)目
- grunt-init /path/to/TEMPLATE?基于指定位置的模版生車(chē)項(xiàng)目
注意大多數(shù)模版都會(huì)在當(dāng)前目錄產(chǎn)生文件,所以請(qǐng)確認(rèn)在新目錄執(zhí)行以確保不會(huì)覆蓋你已有的文件.
Installing templates 安裝模版
一旦你的模版安裝到了~/.grunt-init/目錄(windows下是%USERPROFILE%\.grunt-init\)下, 就可以直接通過(guò)grunt-init來(lái)使用.推薦使用git克隆模版到這個(gè)目錄中.比如,安裝grunt-init-jquery模版可以像這樣:
git clone git@github.com:gruntjs/grunt-init-jquery.git ~/.grunt-init/jquery注意,如果你克隆時(shí)修改了模版的目錄名, 使用grunt-init的時(shí)候就要用修改后的目錄名
下面的模版是由官方來(lái)維護(hù)的: * grunt-init-commonjs * grunt-init-gruntfile * grunt-init-gruntplugin * grunt-init-jquery * grunt-init-node
Custom templates 自定義模版
你可以創(chuàng)建和使用自定義模版,你的模版也要構(gòu)建成前面所提及的結(jié)構(gòu).
一個(gè)叫my-template的示例模版會(huì)有如下的文件結(jié)構(gòu):
- my-template/template.js?- 主模版文件.
- my-template/rename.json?- 模版特殊的重命名規(guī)則,由模版處理.
- my-template/root/?- 目錄中文件將被拷貝到目標(biāo)路徑.
假設(shè)這些文件存在于?/path/to/my-template, 使用命令grunt-init /path/to/my-template將會(huì)處理這個(gè)模版.多個(gè)不同名的模版可以存在于同個(gè)目錄,就像內(nèi)建的模版那樣.
此外,如果你把自定義模版放到你的~/.grunt-init/目錄中,就可以直接使用grunt-init my-template.
Copying files 拷貝文件
只要一個(gè)模版使用了init.fileToCopy和init.copyAndProcess方法,在初始化模版執(zhí)行的時(shí)候,任何在root/子目錄的文件都會(huì)被拷貝到當(dāng)前目錄中.
注意所有已經(jīng)拷貝的文件將會(huì)被模版處理,任何{% %}模版會(huì)收集props數(shù)據(jù)再次處理,除非設(shè)置了noProgress屬性. 請(qǐng)參考jquery template的例子.
Renaming or excluding template file 重命名或者排除模版文件
rename.json描述了sourcepath到destpath的重命名映射.sourcepath必須是一個(gè)相對(duì)于root/目錄的需要拷貝的文件路徑,但是destpath可以包含{% %}模版來(lái)描述目標(biāo)路徑.
如果destpath被指定為false,該文件將不會(huì)被拷貝,同樣,srcpath也支持 glob 模式.
Specifying default prompt answers 指定默認(rèn)的提示答案
每次初始化提示,都會(huì)有一個(gè)硬編碼的默認(rèn)值或者查看當(dāng)前環(huán)境來(lái)嘗試確定一個(gè)默認(rèn)值. 如果你希望覆蓋一個(gè)特定提示的默認(rèn)值,你可以改~/.grunt-init/defaults.json(windows下為%USERPROFILE%\.grunt-init\defaults.json)文件.
例如,我的defaults.json看起來(lái)像這樣,因?yàn)槲蚁胗靡粋€(gè)比默認(rèn)名字稍微不同的名字, 并且排除掉我的email地址,以及自動(dòng)指定一個(gè)作者url.
{"author_name": "\"Cowboy\" Ben Alman","author_email": "none","author_url": "http://benalman.com/" }Defining an init template 定義init模版
exports.description
模版的摘要描述將會(huì)在用戶執(zhí)行g(shù)runt init或者grunt-init的時(shí)候顯示在可用模版的模版名字的后面.
exports.description = descriptionString;exports.notes
如果指定了這個(gè)可選項(xiàng),這個(gè)可選的擴(kuò)展描述將會(huì)出現(xiàn)的任何提示的后面.你可以用它來(lái)給用戶解釋命名慣例,哪些選項(xiàng)是可選的還是必須等你等.
exports.warnOn
如果這個(gè)可選項(xiàng)(但是推薦設(shè)置)的通配符模式或者模式數(shù)組匹配成功, Grunt將會(huì)終止并且提示用戶可以通過(guò)--force選項(xiàng)來(lái)繼續(xù)操作. 這在初始化模版時(shí)會(huì)覆蓋已存在的同名文件時(shí)很有用.
exports.warnOn = 'Gruntfile.js'; // Warn on a Gruntfile.js file. exports.warnOn = '*.js'; // Warn on any .js file. exports.warnOn = '*'; // Warn on any non-dotfile or non-dotdir. exports.warnOn = '.*'; // Warn on any dotfile or dotdir. exports.warnOn = '{.*,*}'; // Warn on any file or dir (dot or non-dot). exports.warnOn = '!*/**'; // Warn on any file (ignoring dirs). exports.warnOn = '*.{png,gif,jpg}'; // Warn on any image file.// This is another way of writing the last example. exports.warnOn = ['*.png', '*.gif', '*.jpg'];exports.template
exports屬性們?cè)谶@個(gè)函數(shù)之外被定義,而所有實(shí)際的初始化代碼都在放在里面.三個(gè)參數(shù)會(huì)傳入這個(gè)函數(shù),grunt參數(shù)是一個(gè)grunt對(duì)象的引用,包含了所有g(shù)runt的方法和庫(kù).init參數(shù)是一個(gè)對(duì)象,包含了init模版的方法和屬性.done參數(shù)是一個(gè)函數(shù),在初始化模版完成之后必須調(diào)用.
exports.template = function(grunt, init, done) {// See the "Inside an init template" section.//里面的內(nèi)容,參考 “初始化模版的內(nèi)部” };Inside an init template 在init模版的內(nèi)部
init.addLicenseFiles
為files對(duì)象添加一個(gè)適當(dāng)?shù)脑S可
var files = {}; var licenses = ['MIT']; init.addLicenseFiles(files, licenses); // files === {'LICENSE-MIT': 'licenses/LICENSE-MIT'}init.availableLicenses
返回一個(gè)可用許可的數(shù)組
var licenses = init.availableLicenses(); // licenses === [ 'Apache-2.0', 'GPL-2.0', 'MIT', 'MPL-2.0' ]init.copy
拷貝文件,你可以給定一個(gè)相對(duì)或者絕對(duì)的源文件路徑,和一個(gè)可選的相對(duì)的目標(biāo)路徑,以及一個(gè)可選的回調(diào)來(lái)文件內(nèi)容.
init.copy(srcpath[, destpath], options)init.copyAndProcess
迭代所有的傳遞進(jìn)來(lái)的文件,把源文件拷貝到目標(biāo)路徑, 并處理文件內(nèi)容.
init.copyAndProcess(files, props[, options])init.defaults
來(lái)自defaults.json的用戶指定的默認(rèn)初始值
init.defaultsinit.destpath
返回目標(biāo)地址的絕對(duì)路徑
init.destpath()init.expand
等同于 grunt.file.expand
返回一個(gè)去重的數(shù)組, 數(shù)組里是所有匹配了給定的通配符的文件或者目錄. 這個(gè)方法同樣接受逗號(hào)分號(hào)的通配符或者通配符組成的數(shù)組. 模式開(kāi)始于!的將會(huì)排除出返回的數(shù)組. 模式會(huì)按提供的數(shù)序處理,所以(使用多個(gè)通配符時(shí))包含和排除的順序很重要.
init.expand([options, ] patterns)init.filesToCopy
返回一個(gè)對(duì)象,對(duì)象包含了所有拷貝到相對(duì)和絕對(duì)路徑的,改名(或者省略的)符合rename.json(如果存在的話)規(guī)則的文件.
var files = init.filesToCopy(props); /* files === { '.gitignore': 'template/root/.gitignore', '.jshintrc': 'template/root/.jshintrc', 'Gruntfile.js': 'template/root/Gruntfile.js', 'README.md': 'template/root/README.md', 'test/test_test.js': 'template/root/test/name_test.js' } */init.getFile
獲取一個(gè)獨(dú)立任務(wù)的文件路徑
init.getFile(filepath[, ...])init.getTemplates
返回一個(gè)包含所有可用的模版的對(duì)象.
init.getTemplates()init.initSearchDirs
初始化目錄并搜索可用模版.template是模版的地址. 同樣包含了~/.grunt-init/和grunt-init的初始化任務(wù)核心.(這段特么的不會(huì)翻譯了!)
init.initSearchDirs([filename])init.process
啟動(dòng)一個(gè)進(jìn)程來(lái)開(kāi)始提示.
init.process(options, prompts, done) init.process({}, [// Prompt for these valuesinit.prompt('name'),init.prompt('description'),init.prompt('version') ], function(err, props) {// All finished, do something with the properties });init.prompt
為用戶展示一個(gè)帶有默認(rèn)值的提示
init.prompt(name[, default])init.prompts
返回一個(gè)所有提示的對(duì)象
var prompts = init.prompts;init.readDefaults
讀入來(lái)自task文件(如果存在)的默認(rèn)JSON, 合并他們到一個(gè)數(shù)據(jù)對(duì)象.
init.readDefaults(filepath[, ...])init.renames
模版的重命名規(guī)則
var renames = init.renames; // renames === { 'test/name_test.js': 'test/{%= name %}_test.js' }init.searchDirs
返回一個(gè)模版的搜索路徑數(shù)組
var dirs = init.searchDirs; /* dirs === [ '/Users/shama/.grunt-init', '/usr/local/lib/node_modules/grunt-init/templates' ] */init.srcpath
根據(jù)文件名搜索初始化模版路徑,并且返回一個(gè)絕對(duì)路徑
init.srcpath(filepath[, ...])init.userDir
返回用戶的模版絕對(duì)路徑
var dir = init.userDir(); // dir === '/Users/shama/.grunt-init'init.writePackageJSON
保存一個(gè)package.json到目標(biāo)目錄.callback回調(diào)可以用來(lái)處理(package.json中的)添加/刪除等等操作.
init.writePackageJSON(filename, props[, callback])Built-in prompts 內(nèi)建提示
author_email
package.json里用的作者email. 將會(huì)尋找用戶的git配置提供一個(gè)默認(rèn)值
author_name
package.json和版權(quán)聲明里使用的用戶全名.將會(huì)尋找用戶的git配置提供默認(rèn)值
author_url
package.json中使用的作者的網(wǎng)站的公開(kāi)url
bin
一個(gè)項(xiàng)目根目錄的相對(duì)路徑指向cli的腳本
bugs
項(xiàng)目的問(wèn)題跟蹤的url.默認(rèn)值會(huì)使用github的issue tracker.
description
項(xiàng)目描述,用在package.json以及README文件中
grunt_version
項(xiàng)目需要的Grunt的有效版本范圍.
homepage
項(xiàng)目的主頁(yè)君. 默認(rèn)會(huì)使用github倉(cāng)庫(kù)地址
jquery_version
如果是個(gè)jQuery的項(xiàng)目, 這個(gè)值用來(lái)描述需要的jQuery版本. 必須是一個(gè)有效語(yǔ)法的版本范圍描述符.
licenses
項(xiàng)目的開(kāi)源許可. 多個(gè)許可用空格分開(kāi). 內(nèi)建的許可有:?MIT,MPL-2.0,'GPL-2.0,和Apache-2.0.默認(rèn)使用MIT`. 添加自定義 的許可可以使用 init.addLicenseFiles.
main
項(xiàng)目主入口,默認(rèn)使用lib目錄中使用項(xiàng)目名稱的文件.
name
項(xiàng)目的名稱. 會(huì)大量的在項(xiàng)目模版中使用.默認(rèn)使用當(dāng)前工作目錄的名字.
node_version
項(xiàng)目需要的nodejs的版本. 必須是一個(gè)有效語(yǔ)法的版本范圍描述符.
npm_test
運(yùn)行你項(xiàng)目測(cè)試的命令. 默認(rèn)使用?grunt.
repository
項(xiàng)目的git倉(cāng)庫(kù). 默認(rèn)會(huì)猜測(cè)github的url
title
一個(gè)易讀的項(xiàng)目名稱.默認(rèn)使用真實(shí)的項(xiàng)目名稱.
version
項(xiàng)目的版本.默認(rèn)使用一個(gè)有效語(yǔ)法版本,0.1.0.
總結(jié)
以上是生活随笔為你收集整理的Grunt 入门指南5:项目脚手架的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: CentOS安装SVN服务器并配置HTT
- 下一篇: 9.Tornado下的一个简易Blog-