有没有办法从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/']
});
答案 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,因为它们不需要第二个项目,但是它们是相同的。
npm install --save broccoli-stew
var stew = require('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;
}
}
};
答案 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']
});