为什么使用 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-component
或ember 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 的一些代码片段:
- 生成代码的 generate command uses the generateFromBlueprint 任务。
- blueprint class.
- 实体名称检查是否未定义:ember-cli-normalize-entity-name
您正在开发内部需要 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-component
或ember 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 的一些代码片段:
- 生成代码的 generate command uses the generateFromBlueprint 任务。
- blueprint class.
- 实体名称检查是否未定义:ember-cli-normalize-entity-name