项目脚手架
grunt-init
Grunt-init 是一个脚手架工具,用于自动化项目创建。它将根据当前环境和对一些问题的回答构建完整的目录结构。创建的确切文件和内容取决于所选模板以及对所提问题的回答。
注意:这个独立的实用程序过去被内置到 Grunt 中作为“init”任务。有关此更改的更多信息,请参阅 Grunt 从 0.3 升级到 0.4 指导。
安装
为了使用 grunt-init,您需要全局安装它。
npm install -g grunt-init
这会将 grunt-init
命令添加到您的系统路径中,允许从任何位置运行它。
注意:您可能需要使用 sudo 或以管理员身份运行命令行才能执行此操作。
用法
- 使用
grunt-init --help
获取程序帮助和可用模板列表 - 使用
grunt-init TEMPLATE
基于可用模板创建项目 - 使用
grunt-init /path/to/TEMPLATE
基于任意位置的模板创建项目
请注意,大多数模板会在当前目录中生成文件,因此如果您不想覆盖现有文件,请务必先切换到新目录。
安装模板
将模板安装到您的 ~/.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-init 模板
- grunt-init-commonjs - 创建一个 commonjs 模块,包括 Nodeunit 单元测试。(示例“生成”存储库 | 创建记录)
- grunt-init-gruntfile - 创建一个基本的 Gruntfile。(示例“生成”存储库 | 创建记录)
- grunt-init-gruntplugin - 创建一个 Grunt 插件,包括 Nodeunit 单元测试。(示例“生成”存储库 | 创建记录)
- grunt-init-jquery - 创建一个 jQuery 插件,包括 QUnit 单元测试。(示例“生成”存储库 | 创建记录)
- grunt-init-node - 创建一个 Node.js 模块,包括 Nodeunit 单元测试。(示例“生成”存储库 | 创建记录)
自定义模板
您可以创建和使用自定义模板。您的模板必须遵循与上述模板相同的结构。
名为 my-template
的示例模板将遵循以下常规文件结构
my-template/template.js
- 主模板文件。my-template/rename.json
- 特定于模板的重命名规则,作为模板处理。my-template/root/
- 要复制到目标位置的文件。
假设这些文件存在于 /path/to/my-template
,则命令 grunt-init /path/to/my-template
将用于处理模板。同一目录中可能存在多个名称唯一的模板。
此外,如果您将此自定义模板放在您的 ~/.grunt-init/
目录(Windows 上为 %USERPROFILE%\.grunt-init\
)中,它将自动可用,只需使用 grunt-init my-template
即可。
复制文件
只要模板使用 init.filesToCopy
和 init.copyAndProcess
方法,当运行 init 模板时,root/
子目录中的任何文件都将被复制到当前目录。
请注意,所有复制的文件都将作为模板进行处理,任何 {% %}
模板都将根据收集的 props
数据对象进行处理,除非设置了 noProcess
选项。有关示例,请参阅 jquery 模板。
重命名或排除模板文件
rename.json
描述了 sourcepath
到 destpath
的重命名映射。sourcepath
必须是相对于 root/
文件夹的要复制的文件的路径,但 destpath
值可以包含 {% %}
模板,描述目标路径是什么。
如果将 false
指定为 destpath
,则不会复制该文件。此外,srcpath
支持 glob 模式。
指定默认提示答案
每个 init 提示要么硬编码了默认值,要么查看当前环境以尝试确定该默认值。如果要覆盖特定提示的默认值,可以在可选的 OS X 或 Linux ~/.grunt-init/defaults.json
或 Windows %USERPROFILE%\.grunt-init\defaults.json
文件中进行。
例如,我的 defaults.json
文件如下所示,因为我想使用与默认名称略有不同的名称,我想排除我的电子邮件地址,并且我想自动指定作者 URL。
{
"author_name": "\"Cowboy\" Ben Alman",
"author_email": "none",
"author_url": "http://benalman.com/"
}
注意:在所有内置提示都被记录下来之前,您可以在 源代码 中找到它们的名称和默认值。
定义 init 模板
exports.description
当用户运行 grunt init
或 grunt-init
以显示所有可用 init 模板的列表时,将显示此简短的模板描述以及模板名称。
exports.description = descriptionString;
exports.notes
如果指定,则在显示任何提示之前,将显示此可选的扩展描述。这是一个很好的地方,可以为用户提供一些帮助,解释命名约定、哪些提示可能是必需的或可选的,等等。
exports.notes = notesString;
exports.warnOn
如果匹配到此可选(但建议使用)的通配符模式或通配符模式数组,Grunt 将中止并显示警告,用户可以使用 --force
覆盖该警告。在 init 模板可能会覆盖现有文件的情况下,这非常有用。
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
属性是在此函数之外定义的,但所有实际的 init 代码都在其中指定。此函数传递了三个参数。grunt
参数是对 grunt 的引用,包含所有 grunt 方法和库。init
参数是一个包含特定于此 init 模板的方法和属性的对象。done
参数是在 init 模板执行完毕时必须调用的函数。
exports.template = function(grunt, init, done) {
// See the "Inside an init template" section.
};
在 init 模板内部
init.addLicenseFiles
将正确命名的许可证文件添加到文件对象。
var files = {};
var licenses = ['MIT'];
init.addLicenseFiles(files, licenses);
// files === {'LICENSE-MIT': 'licenses/LICENSE-MIT'}
init.availableLicenses
返回可用许可证数组。
var licenses = init.availableLicenses();
// licenses === [ 'Apache-2.0', 'GPL-2.0', 'MIT', 'MPL-2.0' ]
init.copy
给定绝对或相对源路径,以及可选的相对目标路径,复制文件,可选地通过传递的回调函数处理它。
init.copy(srcpath[, destpath], options)
init.copyAndProcess
迭代传递的对象中的所有文件,将源文件复制到目标文件,处理内容。
init.copyAndProcess(files, props[, options])
init.defaults
用户在 defaults.json
中指定的默认 init 值。
init.defaults
init.destpath
绝对目标文件路径。
init.destpath()
init.expand
与 grunt.file.expand 相同。
返回与给定通配符模式匹配的所有文件或目录路径的唯一数组。此方法接受逗号分隔的通配符模式或通配符模式数组。与以 ! 开头的模式匹配的路径将从返回的数组中排除。模式按顺序处理,因此包含和排除顺序很重要。
init.expand([options, ] patterns)
init.filesToCopy
返回一个对象,该对象包含要复制的文件及其绝对源路径和相对目标路径,根据 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
获取单个任务文件路径。
init.getFile(filepath[, ...])
init.getTemplates
返回所有可用模板的对象。
init.getTemplates()
init.initSearchDirs
初始化要搜索 init 模板的目录。template
是模板的位置。还将包括 ~/.grunt-init/
和 grunt-init 中的核心 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 默认值,并将它们合并到一个数据对象中。
init.readDefaults(filepath[, ...])
init.renames
模板的重命名规则。
var renames = init.renames;
// renames === { 'test/name_test.js': 'test/{%= name %}_test.js' }
init.searchDirs
要在其中搜索模板的目录数组。
var dirs = init.searchDirs;
/* dirs === [ '/Users/shama/.grunt-init',
'/usr/local/lib/node_modules/grunt-init/templates' ] */
init.srcpath
搜索 init 模板路径以查找文件名并返回绝对路径。
init.srcpath(filepath[, ...])
init.userDir
返回用户模板目录的绝对路径。
var dir = init.userDir();
// dir === '/Users/shama/.grunt-init'
init.writePackageJSON
在目标目录中保存 package.json 文件。回调函数可用于对属性进行后处理以添加/删除/任何操作。
init.writePackageJSON(filename, props[, callback])
内置提示
author_email
要在 package.json
中使用的作者电子邮件地址。将尝试从用户的 git 配置中查找默认值。
author_name
要在 package.json
和版权声明中使用的作者全名。将尝试从用户的 git 配置中查找默认值。
author_url
要在 package.json
中使用的作者网站的公共 URL。
bin
从项目根目录到 cli 脚本的相对路径。
bugs
项目问题跟踪器的公共 URL。如果项目有 GitHub 存储库,则默认为 GitHub 问题跟踪器。
description
项目的描述。用于 package.json
和 README 文件。
grunt_version
项目所需的 Grunt 的有效语义版本范围描述符。
homepage
项目主页的公共 URL。如果是 GitHub 存储库,则默认为 GitHub URL。
jquery_version
如果是 jQuery 项目,则表示项目所需的 jQuery 版本。必须是有效的语义版本范围描述符。
licenses
项目的许可证。多个许可证用空格分隔。内置的许可证有:MIT
、MPL-2.0
、GPL-2.0
和 Apache-2.0
。默认为 MIT
。使用 init.addLicenseFiles 添加自定义许可证。
main
项目的主要入口点。默认为 lib
文件夹中的项目名称。
name
项目的名称。将在整个项目模板中大量使用。默认为当前工作目录。
node_version
项目所需的 Node.js 版本。必须是有效的语义版本范围描述符。
npm_test
在项目上运行测试的命令。默认为 grunt
。
repository
项目的 git 存储库。默认为猜测的 GitHub URL。
title
人类可读的项目名称。默认为更改为更易于人类阅读的实际项目名称。
version
项目的版本。默认为第一个有效的语义版本 0.1.0
。