为什么使用 bower 依赖项的 ember 插件需要覆盖 normalizeEntityName?

Why does an ember addon using a bower dependency needs to override normalizeEntityName?

您正在开发内部需要 bower 包的 ember 插件。当您在 ember 项目中安装此插件时,您需要将 bower 包添加到项目的 bower 依赖项中,以便您的插件可以 运行.

好的 - 很简单,we just need a default blueprint and a call to afterInstall

module.exports = {
  normalizeEntityName: function() {}, // no-op since we're just adding dependencies

  afterInstall: function() {
    return this.addBowerPackageToProject('a-bower-package');
  }
};

为什么需要覆盖 normalizeEntityName? 起初我没有将它添加到我的蓝图中,并且花了很多时间试图查明为什么它没有像我预期的那样安装 bower 依赖项。

我在任何地方都没有看到满意的答案,ember-cli guide explanation doesn't address this and the closest resource I have found was this article,关于这个主题的所有内容是这样的:

The hero we all need, even if the reason we deserve it can be a bit opaque, normalizeEntityName needs to be overridden as a noop inside of the default blueprint in order for ember g your-addon-name to even work. Just set this as the first property of your exported object, and forget all about it (but never forget it in the future ):

所以...我们为什么需要它?

我会尽力解释:) 不清楚的地方请评论。

ember-cli 有some commands 例如:build, serve, generate, install...

要从蓝图中生成一些代码,我们使用 generate 命令。 generate 命令通常用于从蓝图生成某些东西。如ember g component my-componentember g route my-route等...

在这个约定中,生成命令需要第二个参数name。蓝图可以在其 code templates 中使用此参数。 (code templates 不是指 hbs 文件,而是指将在目标应用程序中复制的各种源。如前所述 in here

因此蓝图 class 检查它是否在命令行中提供了名称。如果您不在命令行中提供实体名称,它将抛出异常。

要通过此检查,您的插件的用户需要向您的插件传递一个虚拟参数,例如:

ember g my-addon dummy-name

为防止出现这种无意义的虚拟参数,您需要覆盖默认行为。这是通过添加 normalizeEntityName 钩子来完成的。

当然,您可以跳转到 ember-cli 的代码并通过在蓝图未提供 code templates 时不抛出错误来更改蓝图的行为。但这会带来很多复杂性。

最后,这是来自 ember-cli 的一些代码片段:

  1. 生成代码的 generate command uses the generateFromBlueprint 任务。
  2. blueprint class.
  3. 实体名称检查是否未定义:ember-cli-normalize-entity-name