Node.js: process.cwd(), __dirname, process.argv[0] を駆使して作業ディレクトリを自在に操る
Node.js コマンドラインで作業ディレクトリを決定する方法
以下の3つの方法で、Node.js コマンドラインで作業ディレクトリを決定することができます。
process.cwd() を使用する
最も一般的な方法は、process.cwd()
モジュールを使用することです。これは、現在の作業ディレクトリのパスを返す関数です。
const path = require('path');
console.log(path.resolve(process.cwd()));
このコードは、現在の作業ディレクトリの絶対パスを出力します。
__dirname
変数は、Node.js スクリプトが実行されているディレクトリのパスを常に指します。
console.log(__dirname);
process.argv[0]
は、コマンドラインで最初に指定された引数です。これは、通常、実行されるスクリプトのパスです。
const path = require('path');
console.log(path.resolve(process.argv[0]));
npm
スクリプトを実行する場合、作業ディレクトリは常にスクリプトが定義されているパッケージディレクトリになります。これは、スクリプトが実行される場所にかかわらず、スクリプトが常に同じディレクトリにあるファイルにアクセスできるようにするためです。
例
package.json に次のように scripts
プロパティを定義している場合。
{
"scripts": {
"start": "node bin/script.js"
}
}
npm start
コマンドを実行すると、script.js
スクリプトは常に package.json
ファイルと同じディレクトリで実行されます。
Node.js コマンドラインで作業ディレクトリを決定するには、process.cwd()
, __dirname
, または process.argv[0]
を使用できます。 npm
スクリプトを実行する場合、作業ディレクトリは常にスクリプトが定義されているパッケージディレクトリになります。
const path = require('path');
console.log(path.resolve(process.cwd()));
__dirname 変数を使用する
console.log(__dirname);
const path = require('path');
console.log(path.resolve(process.argv[0]));
npm スクリプトの場合
以下のサンプルコードは、npm
スクリプトを使用して作業ディレクトリを取得する方法を示しています。
const path = require('path');
console.log(path.dirname(require.main.filename));
このコードは、require.main.filename
変数を使用して、メインスクリプトのファイルパスを取得し、その後 path.dirname()
関数を使用してディレクトリ部分を抽出します。
これらのサンプルコードを実際に試して、それぞれの方法がどのように動作するかを確認することをお勧めします。
補足
- 各方法の長所と短所を以下にまとめます。
process.cwd()
: 常に現在の作業ディレクトリを返します。ただし、スクリプトが実行される前に作業ディレクトリが変更された場合、誤った結果を返す可能性があります。__dirname
: スクリプトが実行されているディレクトリを常に返します。ただし、npm
スクリプトの場合は、パッケージディレクトリではなくスクリプトのディレクトリを返します。process.argv[0]
: スクリプトが実行されているディレクトリの絶対パスを返します。ただし、スクリプトがシンボリックリンクの場合は、シンボリックリンク先のディレクトリではなく、リンク先のディレクトリを返します。
- 上記のサンプルコードは、Node.js バージョン 14.15.0 でテストされています。
- サンプルコードを実行する前に、Node.js と npm がインストールされていることを確認してください。
Node.js コマンドラインで作業ディレクトリを決定するその他の方法
環境変数を使用する
以下の環境変数は、作業ディレクトリに関する情報を提供します。
PWD
: 現在の作業ディレクトリのパスCDPATH
: カレント ディレクトリを検索するディレクトリのリスト
これらの環境変数は、process.env
オブジェクトを使用してアクセスできます。
console.log(process.env.PWD);
console.log(process.env.CDPATH);
fs.realpathSync()
関数は、ファイルまたはディレクトリのパスをその絶対パスに変換します。
const fs = require('fs');
console.log(fs.realpathSync('.'));
child_process.execSync()
関数は、コマンドを実行し、その出力を同期的に返します。
const child_process = require('child_process');
console.log(child_process.execSync('pwd'));
このコードは、pwd
コマンドを実行し、その出力を (つまり、現在の作業ディレクトリのパス) コンソールに出力します。
注意事項
上記の方法を使用する場合は、潜在的な落とし穴に注意する必要があります。
PWD
環境変数は、常に正確であるとは限りません。たとえば、bash シェル内でスクリプトを実行する場合、PWD
環境変数は、シェル内で最後に設定されたディレクトリを指す可能性があります。CDPATH
環境変数は、セキュリティ上のリスクをもたらす可能性があります。この環境変数は、ユーザーが任意のディレクトリにアクセスできるようにするためによく使用されます。fs.realpathSync()
関数は、シンボリックリンクを解決する場合に予期しない結果を招く可能性があります。
これらの方法を使用する前に、各方法の長所と短所を慎重に検討することが重要です。
node.js command-line npm