Grunt 项目脚手架
grunt-init是用于创建项目脚手架的工具。它会基于当前工作环境和你给出的一些配置选项构建完整的目录结构。至于其所的具体和,依赖于你所选择的模版和构建过程中你对具体信息所给出的配置选项。
注意:这个独立的程序曾经是作为Grunt内置的"init"任务而存在的。在指南中可以查看更多关于它演变的信息。
Grunt-init 安装
为了使用grunt-init,需要将其安装到全局环境中。
npm install -g grunt-init
这样就会把grunt-init命令安装了到你的系统路径,从而允许你在任何目录中都可以运行它。
注意:你可能需要使用sudo权限或者作为超级运行shell命令来执行这个操作。
Grunt-init
使用grunt-init --help来程序帮助以及列出可用模板清单
使用grunt-init TEMPLATE并基于可用模板创建项目
使用grunt-init /path/to/TEMPLATE基于任意其他目录中可用的模板创建项目
注意,大多数的模板都应该在当前目录(执行命令的目录)中它们的(的项目相关的),因此,如果你不想覆盖现有的,注意一定要切换到新目录中来保证到其他目录。
安装模板
一旦模板被安装到你的~/.grunt-init/目录中(在Windows平台是%USERPROFILE%\.grunt-init\目录),那么就可以通过grunt-init命令来使用它们了。建议你使用git将模板克隆到项目目录中。例如, 模板可以像下面这样安装:
git clone https://github.com/gruntjs/grunt-init-jquery.git ~/.grunt-init/jquery
注意:如果你希望在本地像"foobarbaz"这样使用模板,你应该指定~/.grunt-init/foobarbaz之后再克隆。grunt-init会使用实际在于~/.grunt-init/目录中的实际的目录名。
下面是一些有Grunt官方维护的grunt-init模板:
- Create a commonjs module, including Nodeunit unit tests. ( | )
- Create a basic Gruntfile. ( | )
- Create a Grunt plugin, including Nodeunit unit tests. ( |)
- Create a jQuery plugin, including QUnit unit tests. ( | )
- Create a Node.js module, including Nodeunit unit tests. ( |)
定制模版
你可以创建和使用模板。但是你的模板必须遵循与上述模板相同的结构。
下面是名为my-template的模板示例,它必须遵循下面这样的常规结构:
my-template/template.js - 主模板。
my-template/rename.json - 模板特定的规则,作为模板进行处理。
my-template/root/ - f要复制到目标位置的。
假设这些存储在/path/to/my-template目录中,那么命令grunt-init /path/to/my-template就会处理这些模板。这个目录中可能存在多个命名唯一的模板(多个不重名的模板)。
此外,如果你把这个模板放在你的~/.grunt-init/目录中(在Windows上是%USERPROFILE%\.grunt-init\目录),那么只需要使用grunt-init my-template命令就可以使用这个模版了。
复制
当执行初始化模板时, 只要模板使用init.filesToCopy和init.copyAndProcess,任何位于root/子目录中的都将被复制到当前目录。
注意所有被复制的都会被做为模板进行处理,并且所有{% %}模板都会依据props数据对象集合中的数据进行替换,除非设置了noProcess选项。可以看看中的案例。
或者排除模板
rename.json用于描述sourcepath到destpath的映射关系。sourcepath必须是相对于root/目录要被复制的路径,但是destpath值可以包含{% %}模板,用于描述目标路径是什么。
如果destpath被指定为false,那么就不会被复制。此外,srcpath还符匹配模式。
为询问信息指定认选择
每个初始化都会有硬编码的认值或者它会根据当前环境来尝试确定该缺省值。如果你想覆盖某个特定信息的认值,你可以在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": "https://f2er.com/" }
注意:即使所有的内置信息都有文档,你还可以在中找到他们的名字和认值。
定义初始化模
当运行grunt init或者grunt-init来所有可用的初始化模板时,这个简短的模板描述也会和模板名一起。
exports.description = descriptionString;
如果指定了这个选项,这个可选的扩展描述将会在任何信息之前出来。这是给提供一些解释命名空间相关帮助信息的很好的地方。这些可能是必选的也可能是可选的,等等。
exports.notes = notesString;
如果这个(推荐指定)可选的模式或者模式数组有匹配项出现,Grunt将终止并警告信息,可以使用--force来覆盖这个认行为。这对于初始化模板可能覆盖现有的情况来说是非常有用的。
exports.warnOn = wildcardPattern;
然而最常见的值是'*',它能够匹配任意或者目录。使用符模式具有很大的灵活性。例如:
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定义在该的外面,然而所有实际的初始化指定在它内部。这个接受三个参数,grunt参数是grunt的引用,它包含所有的grunt和库。init参数是包含特定于这个初始化模板而存在的和的对象。done参数是在初始化模板执行完成时必须的。
exports.template = function(grunt, init, done) { // See the "Inside an init template" section. };
初始化模板的内部
可以给files对象适当命名的许可协议证书。
var files = {}; var licenses = ['MIT']; init.addLicenseFiles(files, licenses); // files === {'LICENSE-MIT': 'licenses/LICENSE-MIT'}
返回可用许可协议证书的数组:
var licenses = init.availableLicenses(); // licenses === [ 'Apache-2.0', 'GPL-2.0', 'MIT', 'MPL-2.0' ]
它提供一份绝对或者相对源路径,以及可选的相对的目标路径,复制时,可以通过传递的回调来选择性的处理它。
init.copy(srcpath[, destpath], options)
遍历所传递对象中的所有,将源复制到目标路径,并处理相关。
init.copyAndProcess(files, props[, options])
在defaults.json中指定的认初始值。
init.defaults
目标的。
init.destpath()
与相同。
返回独一无二的与给定符模式所匹配的所有或数组。这个接收逗号分割的符模式或者数组形式的符模式参数。如果路径匹配模式以!开头,与模式所匹配的结果就会从返回的数组中排除。模式是按顺序处理的,所以包含和排除在数组中出现的顺序是非常重要的。
init.expand([options, ] patterns)
返回包含待复制的对象,每个都包含了源的和目标的相对路径,并按照rename.json(如果存在)中的规则进行(或者忽略)。
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格式的认值,并将它们合并到数据对象中。
init.readDefaults(filepath[, ...])
模板的规则。
var renames = init.renames; // renames === { 'test/name_test.js': 'test/{%= name %}_test.js' }
模板的目录数组。
var dirs = init.searchDirs; /* dirs === [ '/Users/shama/.grunt-init', '/usr/local/lib/node_modules/grunt-init/templates' ] */
根据名初始化模板路径并返回。
init.srcpath(filepath[, ...])
返回模板目录的。
var dir = init.userDir(); // dir === '/Users/shama/.grunt-init'
在目标目录中保存package.json。回调可以用于后置处理的/移除/其他操作。
init.writePackageJSON(filename, props[, callback])
内置
用于package.json中的作者邮箱地址。认情况下会尝试从的git配置中找到认值。
用于package.json中的作者全名和。也会尝试从的git配置中找到认值。
package.json中的用于公开作者个人网站的URL。
项目根目录中cli脚本的相对路径。
用于项目问题跟踪的公开URL。如果项目有Github仓库,将指向项目Github的问题跟踪模块(issue)。
项目的描述。通常在package.json或者README中。
项目所需的有效Grunt版本范围定义。
指向项目的公开URL。如果此项目使用的是github仓库,那么,认是Github仓库的url。
如果是jQuery项目,它表示项目所需的jQuery版本。必须是有效的版本范围定义。
项目许可协议证书。多个许可协议证书使用空格分割,内置的许可协议有:MIT、MPL-2.0、GPL-2.0和Apache-2.0。认是MIT协议。可以使用init.addLicenseFiles许可协议证书。
项目的主入口。认是lib目录已项目命名的。
项目。在项目模版中将会大量使用,认指向当前工作目录。
项目所需的Node.js版本。必须是有效的版本范围定义。
项目中运行测试的命令,认情况下是grunt。
项目的git仓库。认是猜测的github url。
适合大家识别的项目。认是原始项目,并且经过过滤,适合大家识别。
项目的版本号。认是第有效的语义版本号:0.1.0。