Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Angular by the Push of a Button: Generating Applications with the CLI and Schematics

Manfred Steyer
September 25, 2018
520

Angular by the Push of a Button: Generating Applications with the CLI and Schematics

# Samples

- [Menu Sample](https://github.com/manfredsteyer/schematics-sample.git)
- [Great introduction in Angular Blog](https://blog.angular.io/schematics-an-introduction-dc1dfbc2a2b2)
- [Angular Schematics Tutorial/ Case Study, 5 articles so far](https://goo.gl/kGS6L5)
Angular-Crud (Generator)
- [Angular CRUD](https://www.npmjs.com/package/angular-crud)

# More: Blog and Angular Training
https://www.softwarearchitekt.at

Manfred Steyer

September 25, 2018
Tweet

Transcript

  1. ManfredSteyer Angular by the Push of a Button: Generating Applications

    with the CLI and Schematics Manfred Steyer SOFTWAREarchitekt.at ManfredSteyer
  2. ManfredSteyer About me… • Manfred Steyer • Blog: SOFTWAREarchitekt.at •

    Angular Trainings and Consultancy • Google Developer Expert (GDE) Page ▪ 4 Manfred Steyer Public: Vienna, München In-House: everywhere http://softwarearchitekt.at/workshops
  3. ManfredSteyer Have you ever tried to … … setup a

    modern JavaScript project manually? • Compiler/ Transpiler • Package manager and packages • Build chain optimized for bundle size, performance, etc. • Testing tools including code coverage • Linting tools
  4. ManfredSteyer Contents • What is Schematics? • How to create

    custom schematics? • How to use parameters? • How to use templates? • How to scaffold whole projects?
  5. ManfredSteyer Schematics Scaffolding Tool used by Angular CLI Schematics: The

    whole project Schematic: Code Generator Collection: Set of Schematics
  6. ManfredSteyer Schematics are atomic (like db transactions) A B D

    E C F A B D E C F Your Project Staging Area Tree Object
  7. ManfredSteyer Schematics are atomic (like db transactions) A B D

    E C F A B D' E C F Your Project Staging Area Tree Object
  8. ManfredSteyer Schematics are atomic (like db transactions) A B D

    E C F A B D' E C F G Your Project Staging Area Tree Object
  9. ManfredSteyer Schematics are atomic (like db transactions) A B D

    E C F A B D' E C F G Your Project Staging Area Tree Object
  10. ManfredSteyer Schematics are atomic (like db transactions) A B D'

    E C F G A B D' E C F G Your Project Staging Area Tree Object
  11. ManfredSteyer Rule Factory export function helloWorld(options: any): Rule { return

    (tree: Tree, _context: SchematicContext) => { _context.logger.debug('Manfred was here!'); tree.create('hello.txt', 'Hello World!'); return tree; }; } Rule
  12. ManfredSteyer Testing in Demo App npm install hello-world or npm

    link ..\hello-world schematics hello-world:hello-world
  13. ManfredSteyer Testing in Demo App npm install hello-world or npm

    link ..\hello-world ng generate hello-world:hello-world
  14. ManfredSteyer Option Class in schema.ts export interface MenuOptions { name:

    string; project: string; […] menuService: boolean; […] } provided by the CLI custom stuff
  15. ManfredSteyer Rule Factory gets Parameter Object export default function (options:

    MenuOptions): Rule { return (host: Tree, context: SchematicContext) => { […] } }
  16. ManfredSteyer Rule Factory gets Parameter Object export default function (options:

    MenuOptions): Rule { return (host: Tree, context: SchematicContext) => { […] } }
  17. ManfredSteyer Template export interface <%= classify(name) %>Item { title: string;

    iconClass: string; } passed property passed function
  18. ManfredSteyer Rule Calling Templates export default function (options: MenuOptions): Rule

    { return (host: Tree, context: SchematicContext) => { […] } }
  19. ManfredSteyer Rule Calling Templates export default function (options: MenuOptions): Rule

    { return (host: Tree, context: SchematicContext) => { const templateSource = apply(url('./files'), [ filterTemplates(options), template({...stringUtils, ...options}), move(options.sourceDir) ]); […] } } passed properties passed functions
  20. ManfredSteyer Rule Calling Templates export default function (options: MenuOptions): Rule

    { return (host: Tree, context: SchematicContext) => { const templateSource = apply(url('./files'), [ filterTemplates(options), template({...stringUtils, ...options}), move(options.sourceDir) ]); const rule = chain([ branchAndMerge(chain([ mergeWith(templateSource), […] ])) ]); return rule(host, context); } }
  21. ManfredSteyer Declaring Generated Components import { NgModule } from '@angular/core';

    import { CommonModule } from '@angular/common'; import { SideMenuComponent } from './side-menu/side-menu.component'; @NgModule({ imports: [ CommonModule ], declarations: [ SideMenuComponent ], exports: [ SideMenuComponent ] }) export class CoreModule { }
  22. ManfredSteyer Injecting Service into Component […] import { SideMenuService }

    from './core/side-menu/side-menu.service'; @Component({ […] }) export class AppComponent { constructor(private sideMenuService: SideMenuService) { // sideMenuService.show = true; } }
  23. ManfredSteyer Code File as Syntax Tree (simplified) ClassDeclaration ClassKeyword (class)

    Identifier (Demo) … SyntaxList class Demo { constructor(otherDemo: Demo) {} } Subtree w/ Constructor …
  24. ManfredSteyer Needed Steps Example covering all cases Finding Variation Points

    Define Model to describe Variation Points Write and Test Generator
  25. ManfredSteyer Further Information • Great introduction in Angular Blog •

    https://blog.angular.io/schematics-an-introduction-dc1dfbc2a2b2 • My Tutorial/ Case Study (5 articles so far) • https://goo.gl/kGS6L5 • Angular-Crud (Generator) • https://www.npmjs.com/package/angular-crud
  26. ManfredSteyer Conclusion Automate boring tasks! Official Solution in ng world

    Staging Area, Templates, Rules schema.json w/ JSON Schema Create own or tweak existing ones