有没有办法从Brocfile(或任何其他地方(的构建中排除文件夹。用例是打包,我有一个由pod中的子应用程序组成的应用程序。例如
/app/modules/components
/app/modules/app1
/app/modules/app2
/app/modules/app3
我想在环境设置为"development"时全部构建它们,或者仅在环境为"app1"时构建它们。有什么建议吗?
我尝试过西兰花锉刀、西兰花漏斗和西兰花合并树的不同组合,但都无济于事。
var removeFile = require('broccoli-file-remover');
module.exports = removeFile(app.toTree(), {
paths: ['app/modules/pod1/', 'app/modules/pod2/']
});
啊,所以在仔细考虑了这一点之后,一切实际上都与我之前的示例中预期的完全一样。
我显然没有足够注意。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
创建一个轻量级的内回购插件。通常,对于这些类型的情况,我更喜欢回购插件,因为它们不需要第二个项目,但在其他方面都是一样的。
- repo插件移除中的ember g
- 我们需要通过
npm install --save broccoli-stew
安装花椰菜炖菜 - 包括它CCD_ 6
- 将hook postprocessTree添加到附加组件
- 当postprocessTree是我们关心的类型时,使用花椰菜炖菜来删除我们不再关心的目录
由此产生的拉取请求:https://github.com/WooDzu/ember-exclude-pod/pull/1
注意:我注意到
template
不是后处理中可用的类型之一,所以我添加了它: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;
}
}
};
我很有信心西兰花炖菜的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}');
如果这不起作用,请随意打开一个关于西兰花炖菜的问题。请确保通过
这真的很晚了,但我创建了一个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']
});