web-dev-qa-db-ja.com

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

ノードのコマンドラインインターフェイスを作成しています。グローバルにインストールされ、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内のコマンドラインディレクトリを取得してみてください。

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

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

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

の代わりに

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

require(lib + '/test');

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

177
Vadim Baryshev

現在の作業ディレクトリ

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

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"
}
33
superluminary

また、現在のNodeJSスクリプトの現在のディレクトリのみを取得する場合は、次のような簡単な方法を試すことができます。これはNode 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);

path.resolve('.')は、ほとんど常にrequire('path')であるため、信頼できるクリーンなオプションでもあります。呼び出し元のディレクトリの絶対パスが表示されます。

1
sziraqui