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

时间:2017-05-26 14:51:45

标签: ember.js ember-cli

您正在开发一个内部需要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 ? 起初我错过了将这个添加到我的蓝图中,花了不少时间试图找出它没有像我期待的那样安装凉亭依赖的原因。

我在任何地方都没有找到满意的答案,ember-cli guide explanation没有解决这个问题,而我找到的最近的资源是this article,其中所有关于该主题的内容都是这样:

  

我们都需要的英雄,即使我们应得的原因可能有点   opaque,normalizeEntityName需要被覆盖为内部的noop   默认蓝图,以便将你的插件名称为偶数   工作。只需将其设置为导出对象的第一个属性即可   忘记一切(但将来永远不会忘记):

那么......为什么我们需要呢?

1 个答案:

答案 0 :(得分:2)

我会尝试解释:)请对不清楚的部分做评论。

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

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

在此约定中,generate命令需要第二个参数name。蓝图可以在code templates中使用此参数。 (code templates并不意味着hbs文件,是指将在目标应用中复制的各种来源。如上所述in here

因此蓝图类会检查命令行中是否提供了名称。如果您未在命令行中提供实体名称,则会抛出异常。

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

ember g my-addon dummy-name

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

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

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

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