Yeoman 生成器版本 0.18.0 - 发布公告

大家好,今天我们很高兴地宣布 yeoman-generator@0.18.0 的发布!

自从我们上次发布次要版本以来已经过去了几个月。这个新版本带来了许多新功能,并努力改进可组合性功能(首次引入于 0.17)。

新功能!

存储提示答案

在提示上使用 {store: true} 属性会将用户答案存储在机器全局存储中。这意味着下次用户运行生成器时,默认答案将使用之前存储的值填充。

请注意,提供默认值会阻止用户返回空答案。

非常感谢 @stefanbuck 提供的 PR https://github.com/yeoman/generator/pull/688

新的文件系统

自 0.17 版本以来,Yeoman 文件系统被证明在解决可组合性问题方面设计不佳。因此,在 0.18 中,我们发布了一个完全重新设计的抽象文件系统。您可以在 此问题中查看讨论和设计过程。

所有旧方法(this.writethis.copy等等)都已向后移植以使用此新系统。因此,更新到 0.18.0 应该会神奇地改进您的生成器。

新的 fs 方法

核心系统可以在 generator.fs 上访问。此对象是 mem-fs-editor 的实例,并提供相同的方法。

此系统比当前的旧方法简单得多,并且不执行任何类型的魔法。它不会自动编译模板(为此请使用 this.fs.copyTpl()),它不会将 this 作为模板上下文传递,并且它不会自动假设路径相对于任何内容。

一个示例/常用用法将是

this.fs.copyTpl(
  this.templatePath("mocha/base-test.js"),
  this.destinationPath("test/index.js"),
  { projectName: "my-awesome-module" }
);

如您所见,我们还添加了两个新的路径助手

  1. this.templatePath() 为:path.join(this.sourceRoot(), ...rest)
  2. this.destinationPath() 为:path.join(this.destinationRoot(), ...rest)

尝试一下,并请告诉我们您对这个新 API 的感受。它比我们的旧方法更冗长,但更清晰且更少魔法。

请注意,旧系统至少在 1.0.0 版本之前将继续可用。

0.17.0 的 this.srcthis.dest 文件实用程序怎么样?

这些应该被视为已弃用。它们做出的设计决策与可组合性不符,从长远来看会造成问题。

文件写入过滤器

您是否曾经希望在每次文件写入时应用自定义过滤器?美化文件、规范化空格等现在是可能的。

在每个 Yeoman 进程中,我们都会将所有修改后的文件写入磁盘。此过程通过 vinyl 对象流(就像 gulp)传递。任何作者都可以注册 transformStream 来修改文件路径或内容。

例如

var beautify = require("gulp-beautify");
this.registerTransformStream(beautify({ indentSize: 2 }));

请注意,**所有文件类型都将通过此流传递**。因此,请确保任何转换流都通过不受支持的文件。像 gulp-ifgulp-filter 这样的工具将有助于过滤无效类型并将其传递。

此新功能意味着您基本上可以使用任何 *gulp* 插件在写入阶段处理生成的文件。

改进

  • 测试 使用 helpers.run() 不会输出到控制台,从而保持测试输出的整洁。每个日志方法现在都是一个 sinon.stub(),这使得断言生成器输出正确的内容变得很容易。
  • 测试运行上下文现在会自动在唯一的 tmpdir 中运行您的测试。无需再手动调用 helper.run().inDir() 了。
  • assert.fileContentassert.noFileContent 接受字符串作为参数(之前我们只接受正则表达式)。
  • 冲突解决程序已重构为简单易用。

安装方法仅运行一次

npmbower 安装助手现在每个进程只运行一次。这是在 0.17 中做出的更改,但我们将此功能扩展到涵盖可能启动这些进程的每个使用/方法。

这在 0.17 中是一个破坏性的边缘情况。但为了清楚起见,让我们明确一点。以下结构将中断

this.installDependencies({
  callback: this.async() // This will block the process forever, and node will fail
});

每个安装方法都将在 install 运行队列 上注册。使用 this.async() 作为回调将导致死锁。

修复

  • 安装方法(npm、bower 助手)现在将选项正确地传递给 spawn 进程。
  • 当目录上发生冲突时,我们不再显示 diff 选项。(在目录上选择 diff 会导致错误)
  • 您现在可以使用 generator.spawnCommand() 正确覆盖 stdio
  • generator.composeWith() 现在可以正确解析 local 选项路径。

元数据

  • 我们已将 yeoman-environment 提取到其自己的存储库中。这意味着这两个 Yeoman 核心部分现在可以各自发展。
  • 我们所有的测试现在都使用 tmpdir 进行测试,使其更可靠。
  • 完全从我们的测试套件中删除网络连接 - 现在速度快得多。

潜在的破坏性更改

  • 我们停止在测试中手动模拟 Inquirer。主要是因为 Inquirer 以我们没有模仿的方式解析值,这导致了太多问题。现在我们更多地依赖 Inquirer,并且只模拟最少的内容。这也意味着我们不会在测试期间创建神奇的 errors 属性。您可以改为侦听生成器错误。
  • 我们删除了 require('yeoman-generator').inquirer。从现在开始,请从您自己的版本中引入。
  • 我们删除了 generator.shellgenerator.request。请引入您自己的版本。

总之

工作尚未完成。我们仍然需要更新我们的一些网站文档以包含新的 API 方法。我们需要将我们的核心生成器更新到此新版本。这些应该很快就会到来,在此期间,请参考这篇文章了解新功能。

因此,享受这个新版本!请升级并让我们知道 API 的感受,并像往常一样随时报告您遇到的任何错误!

干杯


« 查看更多帖子