在Brocfile中排除文件夹的构建

10
有没有办法在Brocfile(或任何其他地方)中从构建中排除一个文件夹?使用情况是打包,我有一个由Pods内的子应用程序组成的应用程序。例如。
/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/']
});
3个回答

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插件。通常对于这些类型的情况,我更喜欢In-Repo插件,因为它们不需要第二个项目,但除此之外它们是相同的。
  1. ember g in-repo-addon remove
  2. 我们需要通过npm install --save broccoli-stew安装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;
    }
  }

};

在测试期间是否有可能不运行这些步骤? - BillPull
像删除一样,有没有一种方法可以排除特定文件夹不被监视以进行更改,即排除一个文件夹进行实时重新加载? - karthikaruna
在将ember-cli从3.3.0更新到3.4.0之后,这不再起作用。 - WooDzu

3

嗨@Stefan。到目前为止还没有成功。我已经创建了一个存储库来重现这个问题,我应该在broccoli-stew或者broccolli-funnel中报告吗?这两个似乎都被用于stew.rm()的内部。 - WooDzu

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']
});

欢迎来到Stack Overflow!虽然这理论上可以回答问题,但最好在此处包含答案的基本部分,并提供参考链接。 - Enamul Hassan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接