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)
誰得?わからない