美文网首页
将Swagger生成的Angular client发布到npm仓

将Swagger生成的Angular client发布到npm仓

作者: 阿呆少爷 | 来源:发表于2019-01-04 18:12 被阅读27次

    本文介绍一下如何将Swagger editor生成的typescript-angular代码发布到npm仓库,并且在一个Angular项目使用该模块。

    发布过程

    使用tsc编译

    安装typescript

    $ npm i -g typescript
    
    $ tsc -v
    Version 3.2.2
    

    创建tsconfig.json

    使用命令生成一个默认的tsconfig.json文件。

    $ tsc --init
    

    tsconfig.json做一些修改。

    "target": "es6,
    "declaration": true,
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true
    

    如果不设置 emitDecoratorMetadata,工程使用这个module时,开发和编译不会有问题,但是运行时,会提示下面这样的错误。

    Uncaught Error: Can't resolve all parameters for xxx: (?, [object Object], ?).
        at syntaxError (compiler.js:2193)
        at CompileMetadataResolver._getDependenciesMetadata (compiler.js:17643)
        at CompileMetadataResolver._getTypeMetadata (compiler.js:17539)
        at CompileMetadataResolver._getInjectableTypeMetadata (compiler.js:17756)
        at CompileMetadataResolver.getProviderMetadata (compiler.js:17765)
        at providers.forEach (compiler.js:17703)
        at Array.forEach (<anonymous>)
        at CompileMetadataResolver._getProvidersMetadata (compiler.js:17663)
        at CompileMetadataResolver.getNgModuleMetadata (compiler.js:17391)
        at CompileMetadataResolver.getNgModuleSummary (compiler.js:17226)
    

    从官方文档:Compiler Options 可以查看这些参数的默认值。

    image.png

    打包 & 发布

    每个js文件都有对应的d.ts文件。

    $ tsc -p . --outDir dist
    $ tree dist/
    dist/
    ├── api
    │   ├── api.d.ts
    │   ├── api.js
    │   ├── taskController.service.d.ts
    │   ├── taskController.service.js
    │   ├── taskStatusController.service.d.ts
    │   └── taskStatusController.service.js
    ├── api.module.d.ts
    ├── api.module.js
    ├── configuration.d.ts
    ├── configuration.js
    ├── encoder.d.ts
    ├── encoder.js
    ├── index.d.ts
    ├── index.js
    ├── model
    │   ├── models.d.ts
    │   ├── models.js
    │   ├── task.d.ts
    │   ├── task.js
    │   ├── taskStatus.d.ts
    │   └── taskStatus.js
    ├── variables.d.ts
    └── variables.js
    

    Swagger editor生成的代码没有package.json,所以在dist目录下手动创建一个。

    {
      "name": "@ali/ram-sdk-validate-control",
      "version": "0.0.1"
    }
    

    最后使用npm publish即可。

    使用tsc编译出来的模块在编译prod版本时会有问题。这个问题暂时无解。使用最新的swagger-codegen-cli 3.0.3版本生成的代码一样有问题。

    $ ng build --prod
                                                                                         
    Date: 2019-01-08T01:40:52.301Z
    Hash: d749aff9d5db5ec2f117
    Time: 8843ms
    chunk {0} runtime.ec2944dd8b20ec099bf3.js (runtime) 1.41 kB [entry] [rendered]
    chunk {1} main.9868d9b237c3a48c54da.js (main) 128 bytes [initial] [rendered]
    chunk {2} polyfills.85f47f0bf59079cbc23a.js (polyfills) 130 bytes [initial] [rendered]
    chunk {3} styles.05e92a7676186b661e8a.css (styles) 405 kB [initial] [rendered]
    
    ERROR in Error during template compile of 'AppModule'
      Function calls are not supported in decorators but 'ApiModule' was called.
    

    使用ng-build编译

    使用ng-build生成module也是一种方法,并且可以解决上面template compile的问题。

    创建项目

    ng new my-app
    

    创建模块

    ng generate library @ali/ram-sdk-validate-control
    

    编译模块

    将Swagger生成的代码拷贝到projects/ali/ram-sdk-validate-control/src目录。

    $ ng build @ali/ram-sdk-validate-control
    Building Angular Package
    Building entry point '@ali/ram-sdk-validate-control'
    Compiling TypeScript sources through ngc
    Bundling to FESM2015
    Bundling to FESM5
    Bundling to UMD
    Minifying UMD bundle
    Copying declaration files
    Writing package metadata
    Removing scripts section in package.json as it's considered a potential security vulnerability.
    Built @ali/ram-sdk-validate-control
    Built Angular Package!
     - from: /private/tmp/my-app/projects/ali/ram-sdk-validate-control
     - to:   /private/tmp/my-app/dist/ali/ram-sdk-validate-control
    

    接着发布便可。

    使用

    使用模块

    import { Component, OnInit } from '@angular/core';
    import { NzMessageService, NzModalService } from 'ng-zorro-antd';
    import { Task, TaskControllerService } from '@ali/ram-sdk-validate-control'
    
    @Component({
      selector: 'app-task-controller',
      templateUrl: './task-controller.component.html',
      styleUrls: ['./task-controller.component.less']
    })
    export class TaskControllerComponent implements OnInit {
      tasks:Task[];
      constructor(private message: NzMessageService, 
        private modalService: NzModalService,
        private taskservice: TaskControllerService) {
        taskservice.listTasksUsingGET()
        .subscribe(tasks => 
          {
            this.tasks = tasks
            console.log("tasks: "+tasks);
          });
       }
    
      ngOnInit() {
      }
    }
    

    参考文章

    1. 使用typescript开发angular模块(发布npm包)
    2. 使用Swagger开发REST API
    3. @swagger/angular2-typescript-petstore@0.0.1

    相关文章

      网友评论

          本文标题:将Swagger生成的Angular client发布到npm仓

          本文链接:https://www.haomeiwen.com/subject/uxpkrqtx.html