Grunt 項目腳手架

2018-11-02 13:50 更新

項目腳手架

grunt-init

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.filesToCopyinit.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用于描述sourcepathdestpath的重命名映射關系。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)置提示信息都有文檔,你還可以在源代碼中找到他們的名字和默認值。

定義一個初始化模

exports.description

當用戶運行grunt init或者grunt-init來顯示所有可用的初始化模板時,這個簡短的模板描述也會和模板名一起顯示。

exports.description = descriptionString;

exports.notes

如果指定了這個選項,這個可選的擴展描述將會在任何提示信息顯示之前顯示出來。這是一個給用戶提供一些解釋命名空間相關幫助信息的很好的地方。這些提示可能是必選的也可能是可選的,等等。

exports.notes = notesString;

exports.warnOn

如果這個(推薦指定)可選的通配模式或者通配模式數(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.template

雖然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.
};

初始化模板的內(nèi)部

init.addLicenseFiles

可以給files對象添加適當命名的許可協(xié)議證書文件。

var files = {};
var licenses = ['MIT'];
init.addLicenseFiles(files, licenses);
// files === {'LICENSE-MIT': 'licenses/LICENSE-MIT'}

init.availableLicenses

返回一個可用許可協(xié)議證書的數(shù)組:

var licenses = init.availableLicenses();
// licenses === [ 'Apache-2.0', 'GPL-2.0', 'MIT', 'MPL-2.0' ]

init.copy

它提供一份絕對或者相對源文件路徑,以及一個可選的相對的目標文件路徑,復制一個文件時,可以通過傳遞的回調(diào)函數(shù)來選擇性的處理它。

init.copy(srcpath[, destpath], options)

init.copyAndProcess

遍歷所傳遞對象中的所有文件,將源文件復制到目標路徑,并處理相關內(nèi)容。

init.copyAndProcess(files, props[, options])

init.defaults

用戶在defaults.json中指定的默認初始值。

init.defaults

init.destpath

目標文件的絕對路徑。

init.destpath()

init.expand

grunt.file.expand相同。

返回一個獨一無二的與給定通配符模式所匹配的所有文件或目錄路徑數(shù)組。這個方法接收一個逗號分割的通配符模式或者數(shù)組形式的通配符模式參數(shù)。如果路徑匹配模式以!開頭,與模式所匹配的結果就會從返回的數(shù)組中排除。模式是按順序處理的,所以包含和排除在數(shù)組中出現(xiàn)的順序是非常重要的。

init.expand([options, ] patterns)

init.filesToCopy

返回一個包含待復制文件的對象,每個文件都包含了源文件的絕對路徑和目標文件的相對路徑,并按照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

獲取單一的任務文件路徑。

init.getFile(filepath[, ...])

init.getTemplates

返回一個包含所有可用模板的對象。

init.getTemplates()

init.initSearchDirs

在初始化目錄中搜索初始化模板。template是指模板的位置。還包括~/.grunt-init和grunt-init中的核心初始化任務。

init.initSearchDirs([filename])

init.process

啟動程序并提示開始輸入。

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

給用戶一個提示,并讓用戶輸入自己選擇的值。

init.prompt(name[, default])

init.prompts

此對象包含了所有提示信息。

var prompts = init.prompts;

init.readDefaults

讀取任務文件中(如果存在)讀取JSON格式的默認值,并將它們合并到一個數(shù)據(jù)對象中。

init.readDefaults(filepath[, ...])

init.renames

模板的重命名規(guī)則。

var renames = init.renames;
// renames === { 'test/name_test.js': 'test/{%= name %}_test.js' }

init.searchDirs

搜索模板的目錄數(shù)組。

var dirs = init.searchDirs;
/* dirs === [ '/Users/shama/.grunt-init',
  '/usr/local/lib/node_modules/grunt-init/templates' ] */

init.srcpath

根據(jù)文件名搜索初始化模板路徑并返回一個絕對路徑。

init.srcpath(filepath[, ...])

init.userDir

返回用戶模板目錄的絕對路徑。

var dir = init.userDir();
// dir === '/Users/shama/.grunt-init'

init.writePackageJSON

在目標目錄中保存一個package.json文件。回調(diào)函數(shù)可以用于后置處理屬性的添加/移除/其他操作。

init.writePackageJSON(filename, props[, callback])

內(nèi)置提示

author_email

用于package.json中的作者郵箱地址。默認情況下會嘗試從用戶的git配置中找到一個默認值。

author_name

用于package.json中的作者全名和版權信息。也會嘗試從用戶的git配置中找到一個默認值。

author_url

package.json中的用于公開作者個人網(wǎng)站的URL。

bin

項目根目錄中cli腳本的相對路徑。

bugs

用于項目問題跟蹤的公開URL。如果項目有一個Github倉庫,將自動指向項目Github的問題跟蹤模塊(issue)。

description

項目的描述。通常在package.json或者README文件中。

grunt_version

項目所需的有效Grunt版本范圍定義。

homepage

指向項目首頁的公開URL。如果此項目使用的是github倉庫,那么,默認是Github倉庫的url。

jquery_version

如果是jQuery項目,它表示項目所需的jQuery版本。必須是一個有效的版本范圍定義。

licenses

項目許可協(xié)議證書。多個許可協(xié)議證書使用空格分割,內(nèi)置的許可協(xié)議有:MIT、MPL-2.0、GPL-2.0Apache-2.0。默認是MIT協(xié)議??梢允褂?a rel="external nofollow" target="_blank" target="_blank">init.addLicenseFiles方法添加自定義許可協(xié)議證書。

main

項目的主入口。默認是lib目錄已項目名稱命名的文件。

name

項目名稱。在項目模版中將會大量使用,默認指向當前工作目錄。

node_version

項目所需的Node.js版本。必須是一個有效的版本范圍定義。

npm_test

項目中運行測試的命令,默認情況下是grunt

repository

項目的git倉庫。默認是一個猜測的github url。

title

適合大家識別的項目名稱。默認是原始項目名稱,并且經(jīng)過過濾,適合大家識別。

version

項目的版本號。默認是第一個有效的語義版本號:0.1.0

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號