如何使用Angular Schematics根据条件跳过或删除指定目录/文件?
Angular Schematics 条件生成目录/文件的最佳方案
针对你需要根据db选项控制目录生成的需求,给你三个实用方案,按推荐度排序:
1. 模板路径内置条件判断(最推荐)
直接在模板目录的命名中使用Schematics的插值语法,把需要条件生成的目录改成带判断的形式:
- 把原有的
files/dir目录重命名为files/{{db ? 'dir' : ''}} - 该目录下的所有文件路径保持不变
当db==true时,这个目录会被解析为files/dir并正常生成;当db==false时,目录名会变成空字符串,Schematics会自动跳过这个目录的生成,完全不会创建相关文件和目录。
注意:确保你的schematics配置(collection.json)中,对应的schematic条目已经启用了模板插值,通常默认是开启的。
2. 在Rule中动态生成条件内容
如果不想修改现有模板结构,可以在自定义Rule里手动控制目录和文件的生成:
- 把固定要生成的
file1、file2放在files目录下,让Schematics自动生成 - 在你的rule函数中,判断
options.db的值,为true时再创建目标目录和文件:
export function mySchematic(options: any): Rule { return (tree: Tree, context: SchematicContext) => { // 固定文件已由files目录自动处理 if (options.db) { // 创建目录 tree.createDirectory('files/dir'); // 创建目录下的文件,示例:dir/file3 tree.create('files/dir/file3', '/* 你的文件内容 */'); // 若需使用模板文件,可借助applyTemplates工具 const templateSource = apply(url('./files/db-templates'), [ template({ ...options }), move('files/dir') ]); return chain([mergeWith(templateSource)]); } return tree; }; }
这种方式完全可控,适合复杂的条件生成场景。
3. 先生成再清理空目录(兼容已有模板)
如果已经有现成的模板目录,不想重构,可以先让Schematics生成所有内容,再删除不需要的目录:
- 先删除目标目录下的所有文件,再删除空目录(
tree.delete()支持删除空目录):
export function mySchematic(options: any): Rule { return (tree: Tree, context: SchematicContext) => { if (!options.db) { const targetDir = 'files/dir'; // 删除目录下所有文件 tree.getDir(targetDir).forEach(filePath => { tree.delete(`${targetDir}/${filePath}`); }); // 删除空目录 tree.delete(targetDir); } return tree; }; }
这种方式是“先建后删”,虽然可行,但不如前两种高效,适合临时改造场景。
内容的提问来源于stack exchange,提问作者user2297996
相关产品推荐
相关产品推荐

