`process.mainModule`プロパティでコマンドライン実行を検知
Node.jsのrequire
とコマンドライン実行の検知
module.parent
module.parent
プロパティは、現在のモジュールを読み込んだモジュールの情報を保持します。コマンドラインで直接実行された場合は、module.parent
はnull
になります。
if (module.parent === null) {
// コマンドラインで実行
} else {
// require で読み込まれた
}
process.mainModule
process.mainModule
プロパティは、メインスクリプトファイルを表すモジュールオブジェクトを返します。コマンドラインで直接実行された場合は、process.mainModule
は現在のモジュール自身を指します。
if (process.mainModule === module) {
// コマンドラインで実行
} else {
// require で読み込まれた
}
コマンドライン引数のチェック
コマンドライン引数をチェックすることで、特定のスクリプトがどのように実行されたかを判別できます。
if (process.argv.length > 1) {
// コマンドライン引数がある
// コマンドラインで実行
} else {
// require で読み込まれた
}
// 1. module.parent
if (module.parent === null) {
console.log('コマンドラインで実行');
} else {
console.log('require で読み込まれた');
}
// 2. process.mainModule
if (process.mainModule === module) {
console.log('コマンドラインで実行');
} else {
console.log('require で読み込まれた');
}
// 3. コマンドライン引数のチェック
if (process.argv.length > 1) {
console.log('コマンドライン引数がある');
console.log('コマンドラインで実行');
} else {
console.log('require で読み込まれた');
}
このコードを実行すると、以下の出力が得られます。
コマンドラインで実行
コマンドラインで実行
コマンドライン引数がある
コマンドラインで実行
上記以外にも、require.main
モジュールや__filename
変数などを利用する方法もあります。
環境変数
環境変数を設定することで、スクリプトの実行方法を判別できます。
例えば、以下のように環境変数を設定できます。
export NODE_SCRIPT_EXECUTION_MODE=command-line
そして、スクリプト内で以下のコードを使用して環境変数を読み込みます。
const executionMode = process.env.NODE_SCRIPT_EXECUTION_MODE;
if (executionMode === 'command-line') {
// コマンドラインで実行
} else {
// require で読み込まれた
}
特殊なファイル名
特殊なファイル名を使用して、スクリプトの実行方法を判別できます。
例えば、スクリプトファイル名をmain.js
のように命名し、以下のコードを使用してファイル名をチェックします。
const filename = process.argv[0];
if (filename === 'main.js') {
// コマンドラインで実行
} else {
// require で読み込まれた
}
これらの方法は、上記の方法よりも柔軟性に欠けますが、特定の状況では有効な場合があります。
node.js require