[Schematics] 1. Copy and Manipulate Template
1. Create a src/my-component/files/src/app
directory to hold your templates.
mkdir -p src/my-component/files/src/app
2. Create an app.component.ts
file in src/my-component/files/src/app
and put the following code in it:
import { Component } from '@angular/core'; @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'] }) export class AppComponent { name = '<%= name %>'; }
The <%= name %>
variable is an option you’ll pass in when running this Schematic. Create an app.component.html
file with some HTML that reads the name variable.
3. Add template as well:
<div style="text-align:center"> <h1> Hello, {{ name }} </h1> </div> <router-outlet></router-outlet>
4. Now what we want is let user to give the 'name' thought prompt, In order to define the name
prompt, create a schema.json
file in the src/my-component
directory.
{ "$schema": "http://json-schema.org/schema", "id": "SchematicsMyComponent", "title": "My Component Schema", "type": "object", "properties": { "name": { "type": "string", "description": "Your Name", "x-prompt": "What is your name?" } }, "required": ["name"] }
Then update src/collection.json
to reference this file in a schema
property.
{ "$schema": "../node_modules/@angular-devkit/schematics/collection-schema.json", "schematics": { "my-component": { "description": "A blank schematic.", "factory": "./my-component/index#myComponent", "schema": "./my-component/schema.json" } } }
5. Then update src/my-component/index.ts
so you can get your generated project’s path, and copy templates.
import { apply, MergeStrategy, mergeWith, move, Rule, SchematicContext, template, Tree, url, FileEnty, forEach } from '@angular-devkit/schematics'; import { join, normalize } from 'path'; import { getWorkspace } from '@schematics/angular/utility/config'; export function setupOptions(host: Tree, options: any): Tree { const workspace = getWorkspace(host); if (!options.project) { options.project = Object.keys(workspace.projects)[0]; } const project = workspace.projects[options.project]; options.path = join(normalize(project.root), 'src'); return host; } export function myComponent(_options: any): Rule { return (tree: Tree, _context: SchematicContext) => { setupOptions(tree, _options); const movePath = normalize(_options.path + '/'); const templateSource = apply(url('./files/src'), [ template({..._options}), move(movePath), // fix for https://github.com/angular/angular-cli/issues/11337 forEach((fileEntry: FileEntry) => { if (tree.exists(fileEntry.path)) { tree.overwrite(fileEntry.path, fileEntry.content); } return fileEntry; }), ]); const rule = mergeWith(templateSource, MergeStrategy.Overwrite); return rule(tree, _context); }; }
We can use this as a template when we want to add some template into the schematics.
6. Test with real application:
ng new my-test-app --routing --style css cd my-test-app npm link ../my-component ng g my-component:my-component
When I tried this, it prompted me:
$ ng g my-component:my-component ? What is your name? Matt UPDATE src/app/app.component.html (109 bytes) UPDATE src/app/app.component.ts (207 bytes)
7. Support for ng add with Angular CLI:
A slick feature of Angular CLI is its ng add
command. You can use it to invoke schematics and add features like PWA support and Angular Material to your projects. For example:
ng add @angular/pwa
ng add @angular/material
You can support for ng add $your-schematic
too! Open my-component/src/collection.json
and add a new ng-add
schematic.
{ "$schema": "../node_modules/@angular-devkit/schematics/collection-schema.json", "schematics": { "my-component": { "description": "A blank schematic.", "factory": "./my-component/index#myComponent", "schema": "./my-component/schema.json" }, "ng-add": { "factory": "./ng-add/index", "description": "Add schematic", "schema": "./my-component/schema.json" } } }
Create src/ng-add/index.ts
and add the code necessary for it to invoke the my-component
schematic.
import { chain, Rule, schematic, SchematicContext, Tree, } from '@angular-devkit/schematics'; export default function (options: any): Rule { return (host: Tree, context: SchematicContext) => { return chain([ schematic('my-component', options) ])(host, context); }; }
After build, link to project, then you can run:
ng add my-component
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2018-10-25 [Unit Testing] Fundamentals of Testing in Javascript
2016-10-25 [Debug] Chrome Devtools: Elements - Console Integration
2016-10-25 [Flexbox] Use Flex to Scale Background Image