大家好,今天我们很高兴地宣布 yeoman-generator@0.18.0 的发布!
自从我们上次发布次要版本以来已经过去了几个月。这个新版本带来了许多新功能,并努力改进可组合性功能(首次引入于 0.17)。
新功能!
存储提示答案
在提示上使用 {store: true}
属性会将用户答案存储在机器全局存储中。这意味着下次用户运行生成器时,默认答案将使用之前存储的值填充。
请注意,提供默认值会阻止用户返回空答案。
非常感谢 @stefanbuck 提供的 PR https://github.com/yeoman/generator/pull/688
新的文件系统
自 0.17 版本以来,Yeoman 文件系统被证明在解决可组合性问题方面设计不佳。因此,在 0.18 中,我们发布了一个完全重新设计的抽象文件系统。您可以在 此问题中查看讨论和设计过程。
所有旧方法(this.write
、this.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" }
);
如您所见,我们还添加了两个新的路径助手
this.templatePath()
为:path.join(this.sourceRoot(), ...rest)
this.destinationPath()
为:path.join(this.destinationRoot(), ...rest)
尝试一下,并请告诉我们您对这个新 API 的感受。它比我们的旧方法更冗长,但更清晰且更少魔法。
请注意,旧系统至少在 1.0.0 版本之前将继续可用。
0.17.0 的 this.src
和 this.dest
文件实用程序怎么样?
这些应该被视为已弃用。它们做出的设计决策与可组合性不符,从长远来看会造成问题。
文件写入过滤器
您是否曾经希望在每次文件写入时应用自定义过滤器?美化文件、规范化空格等现在是可能的。
在每个 Yeoman 进程中,我们都会将所有修改后的文件写入磁盘。此过程通过 vinyl 对象流(就像 gulp)传递。任何作者都可以注册 transformStream
来修改文件路径或内容。
例如
var beautify = require("gulp-beautify");
this.registerTransformStream(beautify({ indentSize: 2 }));
请注意,**所有文件类型都将通过此流传递**。因此,请确保任何转换流都通过不受支持的文件。像 gulp-if 或 gulp-filter 这样的工具将有助于过滤无效类型并将其传递。
此新功能意味着您基本上可以使用任何 *gulp* 插件在写入阶段处理生成的文件。
改进
- 测试 使用
helpers.run()
不会输出到控制台,从而保持测试输出的整洁。每个日志方法现在都是一个sinon.stub()
,这使得断言生成器输出正确的内容变得很容易。 - 测试运行上下文现在会自动在唯一的 tmpdir 中运行您的测试。无需再手动调用
helper.run().inDir()
了。 assert.fileContent
和assert.noFileContent
接受字符串作为参数(之前我们只接受正则表达式)。- 冲突解决程序已重构为简单易用。
安装方法仅运行一次
npm
和 bower
安装助手现在每个进程只运行一次。这是在 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.shell
和generator.request
。请引入您自己的版本。
总之
工作尚未完成。我们仍然需要更新我们的一些网站文档以包含新的 API 方法。我们需要将我们的核心生成器更新到此新版本。这些应该很快就会到来,在此期间,请参考这篇文章了解新功能。
因此,享受这个新版本!请升级并让我们知道 API 的感受,并像往常一样随时报告您遇到的任何错误!
干杯