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