黑人的命也是命

项目脚手架

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 模板

自定义模板

您可以创建和使用自定义模板。您的模板必须遵循与上述模板相同的结构。

名为 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.filesToCopyinit.copyAndProcess 方法,当运行 init 模板时,root/ 子目录中的任何文件都将被复制到当前目录。

请注意,所有复制的文件都将作为模板进行处理,任何 {% %} 模板都将根据收集的 props 数据对象进行处理,除非设置了 noProcess 选项。有关示例,请参阅 jquery 模板

重命名或排除模板文件

rename.json 描述了 sourcepathdestpath 的重命名映射。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 initgrunt-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

项目的许可证。多个许可证用空格分隔。内置的许可证有:MITMPL-2.0GPL-2.0Apache-2.0。默认为 MIT。使用 init.addLicenseFiles 添加自定义许可证。

main

项目的主要入口点。默认为 lib 文件夹中的项目名称。

name

项目的名称。将在整个项目模板中大量使用。默认为当前工作目录。

node_version

项目所需的 Node.js 版本。必须是有效的语义版本范围描述符。

npm_test

在项目上运行测试的命令。默认为 grunt

repository

项目的 git 存储库。默认为猜测的 GitHub URL。

title

人类可读的项目名称。默认为更改为更易于人类阅读的实际项目名称。

version

项目的版本。默认为第一个有效的语义版本 0.1.0