1. ホーム
  2. node.js

[解決済み] ノードビンスクリプト実行時のコマンドライン作業ディレクトリの決定

2022-05-10 12:44:27

質問

ノードのコマンドラインインターフェイスを作成しています。グローバルにインストールされ、実行にはbinファイルを使用します。

作業中のファイルのルートディレクトリでコマンドウィンドウを開き、コマンドを実行する予定ですが、現在の作業ディレクトリを決定することができません。 process.cwd() は、node パッケージのディレクトリを返します。私は当初、バッチファイルをラッパーとしてコードを実行しているので(binファイルが最初にnodeがなくても実行できるのはそのためです)、それは不可能だと考えていましたが、coffee-scriptは何とかそれを実現しています。coffee-scriptのソースを見てみましたが、(経験不足で)ついていけませんでした。

試しに、このpackage.jsonファイルでパッケージを作成してみてください。

{
  "name": "test-package",
  "version": "1.0.0",
  "bin": {
    "test-package":  "./bin/test-package"
  },
  "main": "/lib/test"
}

このtest-packageのファイルをbinに格納します。

#!/usr/bin/env node

var path = require('path');
var fs   = require('fs');
var lib  = path.join(path.dirname(fs.realpathSync(__filename)), '../lib');

require(lib + '/test');

どなたか、この件について教えていただけませんか?

を実行し、コマンドラインのディレクトリを lib/test の中に入れてみてください。

解決方法は?

  • process.cwd() アプリケーション内部で 'process.chdir' によって変更されていなければ、 コマンドが実行されたディレクトリを返します(ノードパッケージのディレクトリではありません)。
  • __filename は、配置されたファイルへの絶対パスを返します。
  • __dirname のディレクトリへの絶対パスを返します。 __filename .

モジュールディレクトリからファイルをロードする必要がある場合、相対パスを使用する必要があります。

require('../lib/test');

ではなく

var lib  = path.join(path.dirname(fs.realpathSync(__filename)), '../lib');

require(lib + '/test');

呼び出し元のファイルに対して常に相対的であり、現在の作業ディレクトリに依存しない。