grunt-init是一個用于自動創(chuàng)建項目的腳手架工具。它會基于當(dāng)前工作環(huán)境和幾個問題的答案,構(gòu)建一個完整的目錄結(jié)構(gòu)。但是這依賴于模板的選擇,它會根據(jù)所提問題的答案,來創(chuàng)建更精確的文件和內(nèi)容。
注意:這個獨立的程序曾經(jīng)是作為Grunt內(nèi)置的init任務(wù)而存在的。在從0.3升級到0.4指南中可以查看更多關(guān)于它演變的信息。
為了能夠使用grunt-init,你應(yīng)該先在全局安裝它:
對于常用的功能或者構(gòu)建插件建議都在全局安裝,從而可以避免在每個項目中都安裝一次而占用更多的存儲空間。當(dāng)然在具體項目中安裝,讀取文件的速度會更快。
npm install -g grunt-init
這樣就會把grunt-init命令植入到你的系統(tǒng)路徑,從而允許你在任何目錄中都可以運行它。
注意:你可能需要使用sudo權(quán)限或者作為超級管理員運行shell命令來執(zhí)行這個操作。
grunt-init --help來獲取程序幫助以及列出可用模板清單; grunt-init TEMPLATE基于可用模板創(chuàng)建一個項目;grunt-init /path/to/TEMPLATE基于任意其他目錄中可用的模板創(chuàng)建一個項目。注意,大多數(shù)的模板都應(yīng)該在當(dāng)前目錄(執(zhí)行命令的目錄)中生成它們的文件(自動生成的項目相關(guān)的文件),因此,如果你不想覆蓋現(xiàn)有的文件,注意一定要切換到一個新目錄中來保證文件生成到其他目錄。
一旦模板被安裝到你的~/.grunt-init/目錄中(在Windows平臺是%USERPROFILE%\.grunt-init\目錄),那么就可以通過grunt-init命令來使用它們了。建議你使用git將模板克隆到項目目錄中。例如, grunt-init-jquery模板可以像下面這樣安裝:
git clone https://github.com/gruntjs/grunt-init-jquery.git ~/.grunt-init/jquery
注意:如果你希望在本地像"foobarbaz"這樣使用模板,你應(yīng)該指定~/.grunt-init/foobarbaz之后再克隆。grunt-init會使用實際在于~/.grunt-init/目錄中的實際的目錄名。
下面是一些有Grunt官方維護(hù)的grunt-init模板:
grunt-init-commonjs - 創(chuàng)建一個包含Nodeunit單元測試的commonjs模塊。(sample "generated" repo | creation transcript)
grunt-init-gruntfile - 創(chuàng)建一個基本的Gruntfile。(sample "generated" repo | creation transcript)
grunt-init-gruntplugin - 創(chuàng)建一個包含Nodeunit單元測試的Grunt插件。(sample "generated" repo | creation transcript)
grunt-init-jquery - 創(chuàng)建一個包含QUnit單元測試的jQuery插件。(sample "generated" repo | creation transcript)
你可以創(chuàng)建和使用自定義模板。但是你的模板必須遵循與上述模板相同的文件結(jié)構(gòu)。
下面是一個名為my-template的模板示例,它必須遵循下面這樣的常規(guī)文件結(jié)構(gòu):
my-template/template.js - 主模板文件;my-template/rename.json - 模板特定的重命名規(guī)則,用于處理模板;my-template/root/ - 要復(fù)制到目標(biāo)位置的文件。假設(shè)這些文件存儲在/path/to/my-template目錄中,那么命令grunt-init /path/to/my-template就用于處理這些模板。這個目錄中可能存在多個命名唯一的模板(多個不重名的模板)。
此外,如果你把這個自定義模板放在你的~/.grunt-init/目錄中(在Windows上是%USERPROFILE%\.grunt-init\目錄),那么只需要使用grunt-init my-template命令它就會自動變得可用。
當(dāng)執(zhí)行初始化模板時, 只要模板使用init.filesToCopy和init.copyAndProcess方法,任何位于root/子目錄中的文件都將被復(fù)制到當(dāng)前目錄。
注意所有被復(fù)制的文件都會被處理為模板,并且所有暴露在props數(shù)據(jù)對象集合中的{% %}模板都會被處理,除非設(shè)置了noProcess選項??梢钥纯?a rel="nofollow" >jquery template的例子。
rename.json用于描述sourcepath到destpath的重命名映射關(guān)系。sourcepath必須是相對于root/目錄要被復(fù)制的文件路徑,但是destpath值可以包含{% %}模板,用于描述目標(biāo)路徑是什么。
如果destpath被指定為false,那么文件就不會被復(fù)制。此外,srcpath還支持通配符匹配模式。
每個初始化提示都會有一個硬編碼的默認(rèn)值或者它會根據(jù)當(dāng)前環(huán)境來嘗試確定該缺省值。如果你想覆蓋某個特定提示信息的默認(rèn)值,你可以在OS X或者Linux的~/.grunt-init/defaults.json或者Windows的%USERPROFILE%\.grunt-init\defaults.json文件中選擇性的進(jìn)行處理。
例如,由于我希望使用一個與眾不同的名字來替代默認(rèn)的名字,并且我還希望排除我的郵箱地址,同時我還希望自動指定一個作者的url,那么我的defaults.json看起來就可能像下面這樣。
{
"author_name": "\"Cowboy\" Ben Alman",
"author_email": "none",
"author_url": "http://benalman.com/"
}
注意: 即使記錄了所有的內(nèi)置提示信息都被重新定義了,你仍然可以在源代碼中找到他們的名字和默認(rèn)值。
當(dāng)用戶運行grunt init或者grunt-init來顯示所有的有效初始化模板時,這個簡短的模板描述也會和模板名一起顯示。
exports.description = descriptionString;
如果指定了這個選項,這個可選的擴(kuò)展描述將會在任何提示信息顯示之前顯示出來。這是一個給用戶提供一些解釋命名空間相關(guān)幫助信息的很好的地方。這些提示可能是必選的也可能是可選的,等等。
exports.notes = noteString;
如果這個(推薦指定)可選的通模式或者通配模式數(shù)組匹配了,Grunt將終止并生成一個警告信息,用戶可以使用--force來覆蓋這個默認(rèn)行為。這對于初始化模板可能覆蓋現(xiàn)有文件的情況來說是非常有用的。
exports.warnOn = wildcardPattern;
然而最常見的值是'*',它能夠匹配任意文件或者目錄。使用minimatch通配符模式具有很大的靈活性。例如:
exports.warnOn = 'Gruntfile.js'; // 警告Gruntfile.js文件.
exports.warnOn = '*.js'; //警告任意.js文件
exports.warnOn = '*'; //警告任意非點文件或目錄
exports.warnOn = '.*'; //警告任意點文件或目錄
exports.warnOn = '{.*, *}'; //警告任意文件或目錄
exports.warnOn = '!*/**'; //警告任意目錄中的文件
exports.warnOn = '*.{png,gif,jpg}'; //警告任意圖片文件
//最后一個例子的另一種形式
exports.warnOn = ['*.png','*.gif','*.jpg'];
雖然exports屬性定義在該函數(shù)的外面,然而所有實際的初始化代碼指定在它內(nèi)部。這個函數(shù)接受三個參數(shù),grunt參數(shù)是一個grunt的引用,它包含所有的grunt方法和庫。init參數(shù)是一個包含特定于這個初始化模板而存在的方法和屬性的對象。done參數(shù)是在初始化模板執(zhí)行完成時必須調(diào)用的函數(shù)。
exports.template = function(grunt, init, done){
//查看"Inside an init template"一節(jié)
};
可以給files對象添加適當(dāng)命名的許可協(xié)議證書文件。
var files = {};
var licenses = ['MIT'];
init.addLicenseFiles(files, licenses);
// files === {'LICENSE-MIT': 'licenses/LICENSE-MIT'}
返回一個可用許可協(xié)議證書的數(shù)組:
var licenses = init.availableLicenses();
// licenses = ['Apache-2.0', 'GPL-2.0', 'MIT', 'MPL-2.0']
它提供一份絕對或者相對源文件路徑,以及一個可選的相對的目標(biāo)文件路徑,復(fù)制一個文件時,可以通過傳遞的回調(diào)函數(shù)來選擇性的處理它。
init.copy(srcpath[, destpath], options);
遍歷所傳遞對象中的所有文件,將源文件復(fù)制到目標(biāo)路徑,并處理相關(guān)內(nèi)容。
init.copyAndProcess(files, props[, options]);
用戶在defaults.json中指定的默認(rèn)初始值。
init.defaults
目標(biāo)文件絕對路徑。
init.destpath();
返回一個獨一無二的與給定通配符模式所匹配的所有文件或目錄路徑數(shù)組。這個方法接收一個逗號分割的通配符模式或者數(shù)組形式的通配符模式參數(shù)。如果路徑匹配模式以!開頭,與模式所匹配的結(jié)果就會從返回的數(shù)組中排除。模式是按順序處理的,所以包含和排除的順序是很明顯的。
init.expand([options, ] patterns);
返回一個包含待復(fù)制文件源文件的絕對路徑和相對的目標(biāo)路徑的對象,并按照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'
} */
獲取單一的任務(wù)文件路徑。
init.getFile(filepath[, ...]);
返回一個包含所有可用模板的對象。
init.getTemplates()
在初始化目錄中搜索初始化模板。template是指模板的位置。還包括~/.grunt-init和grunt-init中的核心初始化任務(wù)。
init.initSearchDirs([filename]);
啟動程序并提示開始輸入。
init.process(options, prompts, done);
init.process({}, [
//Prompt for these values
init.prompt('name'),
init.prompt('description'),
init.prompt('version')
], function(err, props){
// All finished, do something with the properties
});
給用戶一個提示值。
init.prompt(name[, default])
包含所有提示信息對象。
var prompts = init.prompts();
讀取任務(wù)文件中JSON默認(rèn)值(如果存在),并將它們合并到一個數(shù)據(jù)對象中。
init.readDefaults(filepath[, ...])
模板的重命名規(guī)則。
var renames = init.renames;
//renames = {'test/name_test.js': 'test/{%= name%}_test.js' }
搜索模板的目錄數(shù)組。
var dirs = init.searchDirs;
/* dirs = ['/Users/shama/.grunt-init',
'/usr/local/lib/node_modules/grunt-init/templates' ] */
根據(jù)文件名搜索初始化模板路徑并返回一個絕對路徑。
init.srcpath(filepath[, ...]);
返回用戶模板目錄的絕對路徑。
var dir = init.userDir();
//dir === '/Users/shama/.grunt-init'
在目標(biāo)目錄中保存一個package.json文件?;卣{(diào)函數(shù)可以用于后置處理屬性的添加/移除/其他操作。
init.writePackageJSON(filename, props[, callback]);
用于package.json中的作者郵箱地址。默認(rèn)情況下會嘗試從用戶的git配置中找到一個默認(rèn)值。
用于package.json中的作者全名和版權(quán)信息。也會嘗試從用戶的git配置中找到一個默認(rèn)值。
package.json中的用于公開作者個人網(wǎng)站(博客)的URL。
項目根目錄中cli腳本的相對路徑。
用于項目問題跟蹤的公開URL。如果項目有一個Github倉庫,將自動指向項目Github的問題跟蹤模塊(issue)。
項目的描述。通常在package.json或者README文件中。
項目所需的有效Grunt版本范圍描述符。
指向項目首頁的公開URL。如果是Github倉庫將默認(rèn)指向Github上的url。
如果是jQuery項目,它表示項目所需的jQuery版本。必須是一個有效的版本范圍描述符。
項目許可協(xié)議證書。多個許可協(xié)議證書使用空格分割,內(nèi)置的許可協(xié)議有:MIT,MPL-2.0,GPL-2.0和Apache-2.0??梢允褂?a rel="nofollow" >init.addLicenseFiles方法添加自定義許可協(xié)議證書。
項目主入口點,默認(rèn)情況下是lib目錄中的項目名稱(通常是項目名稱目錄)。
項目名稱。在項目模版中將會大量使用,默認(rèn)指向當(dāng)前工作目錄。
項目所需的Node.js版本。必須是一個有效的版本范圍描述符。
項目中運行測試的命令,默認(rèn)情況下是grunt。
項目的git倉庫,默認(rèn)猜測為一個github上的url。
一個用戶可讀的項目名稱,默認(rèn)是修改過的讓更多人可讀的實際項目名稱。
項目的版本,默認(rèn)指向第一個有效的語義版本,0.1.0。