ノードビンスクリプトの実行時にコマンドラインの作業ディレクトリを決定する


120

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

作業中のファイルのルートディレクトリでコマンドウィンドウを開いてコマンドを実行する予定ですprocess.cwd()が、ノードパッケージのディレクトリを返すため、現在の作業ディレクトリを特定できませんでした。最初はコードがバッチファイルをラッパーとして使用して実行されているため(つまり、最初にノードなしでbinファイルを実行できる方法)、それは不可能ですが、coffee-scriptがそれを実行します。私はコーヒースクリプトのソースを確認しましたが、それを追跡できませんでした(十分な経験がありませんでした)。

自分でテストするには、このpackage.jsonファイルでパッケージを作成します。

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

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内のコマンドラインディレクトリを取得します。

回答:


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

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

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

の代わりに

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

require(lib + '/test');

それは常にそれが呼び出されたファイルに相対的であり、現在の作業ディレクトリに依存しません。


2
の後process.chdir()、オリジナルを入手する方法はありますか?
reergymerej 2015

@reergymerej chdir()を実行する前に、まずcwdを保存する必要があります(たとえば、var originalCwd = process.cwd();を実行するとprocess.chdir()、後で元の状態に戻すことができます)。
回転

ある../lib/testポータブル?
セバスチャン

いいえ。Windowsはバックスラッシュを使用するため、ポータブルソリューションではありません。したがって、Windowsで実行しようとしても機能しません。
zachdyer 2018

1
実際、NodeJSの場合、これはすべて同じです。Windowsでも、Unixの方法で相対パスを簡単に要求できます。だから、../lib/testWindowsのカウンターパートは、一方、ポータブルで..\lib\testはない...
クリスチャンUlbrich

48

現在の作業ディレクトリ

現在の作業ディレクトリを取得するには、次を使用できます。

process.cwd()

ただし、一部のスクリプト、特にgulpは、現在の作業ディレクトリをで変更することに注意してくださいprocess.chdir()

ノードモジュールパス

現在のモジュールのパスを取得するには:

  • __filename
  • __dirname

元のディレクトリ(コマンドが開始された場所)

コマンドラインからスクリプトを実行していて、スクリプトが現在動作しているディレクトリに関係なく、スクリプトが実行された元のディレクトリが必要な場合は、次のコマンドを使用できます。

process.env.INIT_CWD

NPMスクリプトを処理する場合の元のディレクトリー

プロジェクトのルートではなく、現在のディレクトリでNPMスクリプトを実行することが望ましい場合があります。

この変数は、npmパッケージスクリプト内で次のように使用できます。

$INIT_CWD.

NPMの最新バージョンを実行している必要があります。この変数が使用できない場合は、NPMが最新であることを確認してください。

これにより、package.jsonの現在のパスにアクセスできます。例:

scripts: {
  "customScript": "gulp customScript --path $INIT_CWD"
}

process.env.INIT_CWDdirを返しますpackage.json
ヴォーン

2
$ INIT_CWDはLinuxでのみ機能します。Windowsの場合、%INIT_CWD%を使用する必要があります。この問題はnpmjs.com/package/cross-envを使用することで解決できると思いますが、私自身は試していません
Stephanie

3

または、現在のNodeJSスクリプトの現在のディレクトリのみを取得したい場合は、次のような簡単な方法を試すことができます。これはノードCLI自体では機能しないことに注意してください。

var fs = require('fs'),
    path = require('path');

var dirString = path.dirname(fs.realpathSync(__filename));

// output example: "/Users/jb/workspace/abtest"
console.log('directory to start walking...', dirString);

3

path.resolve('.')また、ほとんどの場合、信頼性が高くクリーンなオプションrequire('path')です。呼び出されたディレクトリの絶対パスが表示されます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.