从Brocfile中的构建中排除文件夹

时间:2015-06-06 18:43:09

标签: javascript ember.js ember-cli broccolijs

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

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

我希望在环境设置为“开发”时全部构建它们。或仅限于。 ' APP1'当环境是'app1'。有什么建议吗?

我尝试过不同的西兰花锉刀去除,西兰花漏斗和西兰花 - 合并树的组合无济于事。

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

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

3 个答案:

答案 0 :(得分:4)

啊,所以在实际考虑清楚之后,一切都在我之前的例子中完全按预期工作。

我显然没有给予足够的重视。 app.toTree()执行此操作为时已晚,因为所有内容都已构建并已完成。

幸运的是,ember-cli确实可以让插件在不同的生命周期里程碑中修改适当的树。

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

应该做的技巧是Addon.prototype.postprocessTree。现在我们有两个选择,我们可以通过ember addon构建一个独立的插件,或者我们可以通过ember g in-repo-addon创建一个轻量级的回购插件。通常对于这些类型的情况,我更喜欢in-repo-addons,因为它们不需要第二个项目,但是它们是相同的。

  1. ember g in-repo-addon remove
  2. 我们需要通过npm install --save broccoli-stew
  3. 安装西兰花炖菜
  4. 包含它var stew = require('broccoli-stew');
  5. 将hook postprocessTree添加到附加组件
  6. 当postprocessTree用于我们关心的类型时,请使用broccoli-stew删除我们不再关心的目录。
  7. 结果拉取请求: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;
        }
      }
    
    };
    

答案 1 :(得分:3)

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

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

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

如果这不起作用,请随意在西兰花炖菜上打开一个问题。请务必提供一个正在运行的示例

答案 2 :(得分:0)

这已经很晚了,但我创建了一个Broccoli插件来做这件事。它可以在https://www.npmjs.com/package/broccoli-rm获得。

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

var rm = require('broccoli-rm');
var input = app.toTree();
module.exports = output = rm([input], {
   paths: ['app/modules/pod1', 'app/modules/pod2']
});