Schematicsをoclifから実行する

NestJSやAngularでファイルを作成する時に使用されているschematicsというライブラリがあります。 これを使うことで、簡単にファイルの生成やデータの更新などが可能になります。 これを自作のCLIでも動かせ […]

広告ここから
広告ここまで

目次

    NestJSやAngularでファイルを作成する時に使用されているschematicsというライブラリがあります。

    これを使うことで、簡単にファイルの生成やデータの更新などが可能になります。

    これを自作のCLIでも動かせるようにしたいなと思ったので、いろいろ調べてみました。

    Step1: oclifでCLIプロジェクトを立ち上げる

    まずはサンプルのCLIプロジェクトを作ります。

    今回はoclifを使いましたが、ここは他のライブラリなどでも問題ないはずです。

    $ npx oclif single schematics-cli
    $ cd schematics-cli

    セットアップが完了できていれば、以下のようなコマンド入力でメッセージが表示されるはずです。

    $ ./bin/run 
    hello world from ./src/index.ts

    Step2: schematics-cliのインストール

    schematicsを実行するためのCLIをインストールします。

    $ yarn add @angular-devkit/schematics-cli

    Step3: NestJSのschematicsをインストール

    生成する内容を定義したライブラリが各プロジェクトで公開されています。

    今回はNestJSのschematicsをインストールしてみました。

    $ yarn add @nestjs/schematics

    Step4: schematicsをoclifから実行する

    schematicsのCLIソースを読む限り、main関数を実行することで動かせそうでした。

    ということでoclifから直接呼び出すように書いてみます。

    import {Command} from '@oclif/command'
    import {
      main
    } from "@angular-devkit/schematics-cli/bin/schematics"
    
    class SchematicsCli extends Command {
      static description = 'describe the command here'
    
      async run() {
        await main({
          args: [
              "@nestjs/schematics:interface",
              "--name=helloOclif"
          ]
      })
      }
    }
    
    export = SchematicsCli
    

    argにはstringの配列を渡します。内容はschematics-cliを直接実行する時の引数をそのまま渡せばよさそうです。

    Execute

    最後にoclifコマンドを実行してみます。

    先ほどと異なり、NestJSのファイルが生成されたというメッセージが出るようになっています。

    % ./bin/run
    CREATE src/hello-oclif.interface.ts (31 bytes)
    
    $ cat ./src/hello-oclif.interface.ts
    export interface HelloOclif {}

    まとめ

    自作のCLIコマンドでschematicsを使いたい場合、main関数を実行するようにすれば良さそうです。

    引数をCLIとschematicsそれぞれで管理し、CLIからschematicsにproxyしてやる必要がありますので要注意です。

    実際にやる場合は、schematicsとCLIをLernaなどでモノレポ管理にしてやると効率が良いのではないかと思います。

    おまけ: schematics-cliから直接実行する場合

    ちょっと雑ですが、以下のようなステップでschematics-cliからNestJSやAngularなどのschematicsを実行することも可能です。

    $ npm init -y
    $ npm i -D @angular-devkit/schematics-cli
    $ npm i -S @nestjs/schematics
    $ ./node_modules/.bin/schematics @nestjs/schematics:interface --name test
    CREATE src/test.interface.ts (25 bytes)

    誰得?わからない

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark