10

有没有办法从 Brocfile (或任何其他地方)的构建中排除文件夹。用例是打包,我有一个由 pod 内的子应用组成的应用。例如。

/app/modules/components
/app/modules/app1
/app/modules/app2
/app/modules/app3

当环境设置为“开发”或仅例如时,我想全部构建它们。当环境为“app1”时为“app1”。有什么建议么?

我尝试了 broccoli-file-remover、broccoli-funnel 和 broccoli-merge-trees 的不同组合,但无济于事。

var removeFile = require('broccoli-file-remover');

module.exports = removeFile(app.toTree(), {
    paths: ['app/modules/pod1/', 'app/modules/pod2/']
});
4

3 回答 3

4

啊,所以在真正考虑清楚这一点之后,一切实际上都按照我之前的示例中的预期工作。

我显然没有足够的注意力。app.toTree()执行此操作为时已晚,因为所有内容都已构建和连接。

幸运的是,ember-cli 确实使插件能够在各种生命周期里程碑修改适当的树。

有关当前可用的钩子的更多详细信息,请参阅:https ://github.com/ember-cli/ember-cli/blob/master/ADDON_HOOKS.md。

应该解决问题的钩子是Addon.prototype.postprocessTree. 现在我们有两个选择,我们可以构建一个独立的插件,ember addon或者我们可以创建一个轻量级的 in-repo 插件 via ember g in-repo-addon。通常对于这些类型的情况,我更喜欢 in-repo-addons,因为它们不需要第二个项目,但除此之外它们是相同的。

  1. ember g in-repo-addon 删除
  2. 我们需要通过安装 broccoli-stewnpm install --save broccoli-stew
  3. 包括它var stew = require('broccoli-stew')
  4. 将钩子 postprocessTree 添加到附加组件
  5. 当 postprocessTree 是我们关心的类型时,使用 broccoli-stew 删除我们不再关心的目录。

生成的拉取请求:https ://github.com/WooDzu/ember-exclude-pod/pull/1

注意:我注意到template不是 postprocess 中可用的类型之一,所以我添加了它:https ://github.com/ember-cli/ember-cli/pull/4263 (应该是下一个 ember-cli 版本的一部分)

注意:我们真的想要一个额外的钩子 Addon.prototype.preprocessTree,因为在我们构建它们之前忽略这些文件。我打开了一个相关问题: https ://github.com/ember-cli/ember-cli/issues/4262

上述步骤的输出

var stew = require('broccoli-stew');

module.exports = {
  name: 'remove',

  isDevelopingAddon: function() {
    return true;
  },

  postprocessTree: function(type, tree){
    if (type === 'js' || type === 'template')   {
      return stew.rm(tree, '*/modules/pod{1,2}/**/*');
    } else {
      return tree;
    }
  }

};
于 2015-06-09T19:44:14.787 回答
3

我非常有信心 broccoli-stew 的 rm 会正确处理这个问题。

https://github.com/stefanpenner/broccoli-stew/blob/master/lib/rm.js#L4-L40甚至有测试非常相似的场景:https ://github.com/stefanpenner/broccoli-炖/blob/master/tests/rm-test.js#L48-L57

var stew = require('broccoli-stew');
module.exports = stew.rm(app.tree(), 'app/modules/{pod1,pod2}');

如果这不起作用,请随时在 broccoli-stew 上打开一个问题。请务必提供一个运行示例

于 2015-06-07T18:44:55.757 回答
0

这真的很晚了,但我创建了一个 Broccoli 插件来做到这一点。可在https://www.npmjs.com/package/broccoli-rm获得。

(诀窍是检测排除的路径是否是文件夹,然后使用全局匹配来确保在复制过程中文件夹的所有子项都没有符号链接。)

var rm = require('broccoli-rm');
var input = app.toTree();
module.exports = output = rm([input], {
   paths: ['app/modules/pod1', 'app/modules/pod2']
});
于 2016-07-17T00:33:39.753 回答