詩と創作・思索のひろば

ドキドキギュンギュンダイアリーです!!!

Fork me on GitHub

ts-nodeで実行中かどうか確認する

TypeScript でユーティリティ的なスクリプトを開発しているとき、毎回 tsc でコンパイルして node で実行するのはあまりに重たいのでやってられない。

ts-node というのでコンパイル作業なしに直接 .ts ファイルを実行できるんだけど、.ts ファイルとコンパイル後の .js ファイルの位置が異なっているので微妙に困ることがある。ファイルからの相対位置で何かを指定するような場合ですね。

なので ts-node 下での実行かどうかを判定したい。process.argv[0] らへんを見ると素の node との違いはわかるんだけど、本質的な情報ではないのでちょっと気持ち悪いところがある。

と思って調べていたらちょうどそういう話があって、結局、以下のようにして調べられるらしい。process を拡張してるんですね。なるほど。

import { REGISTER_INSTANCE } from "ts-node";

const tsService = process[REGISTER_INSTANCE]; // これがあれば ts-node で実行中

ただ、これだと ts-node が成果物の依存に入ってしまうので、REGISTER_INSTANCE の代わりに Symbol.for('ts-node.register.instance') を使ったほうがいいかもしれない。どっちも微妙。

ちなみに process[REGISTER_INSTANCE] には TypeScript コンパイラの設定が入ってるようなので、ここからさらに詳細な設定を知ることも可能そうではある。

はてなで一緒に働きませんか?