[解決済み] 実行中のnode.jsアプリケーションからプロジェクトルートを決定する
質問
以外の方法はありますか?
process.cwd()
現在のプロジェクトのルートディレクトリのパス名を取得するためです。Nodeはrubyのプロパティのようなものを実装しているのでしょうか?
Rails.root
,. 私は、一定で、信頼できるものを探しています。
解決方法は?
アプローチ方法は様々で、それぞれに長所と短所があります。
require.main.filename
から http://nodejs.org/api/modules.html :
Nodeから直接ファイルを実行した場合。
require.main
には、そのmodule
. つまり、あるファイルが実行されたかどうかは、直接require.main === module
なぜなら
module
を提供します。filename
プロパティ(通常は__filename
をチェックすることで、現在のアプリケーションのエントリポイントを取得することができます。require.main.filename
.
だから、アプリのベースディレクトリが欲しいなら、そうすればいい。
const { dirname } = require('path');
const appDir = dirname(require.main.filename);
長所と短所
ほとんどの場合、この方法はうまくいきますが、もしアプリを pm2 を実行したり モカ のテストでは、このメソッドは失敗します。
module.paths
Node はすべてのモジュール検索パスを
module.paths
. これらをトラバースして、解決した最初のものを選ぶことができます。
async function getAppPath() {
const { dirname } = require('path');
const { constants, promises: { access } } = require('fs');
for (let path of module.paths) {
try {
await access(path, constants.F_OK);
return dirname(path);
} catch (e) {
// Just move on to next path
}
}
}
長所と短所
これは時々動作しますが、アプリケーションをインストールしたディレクトリではなく、パッケージがインストールされたディレクトリを返す可能性があるため、パッケージで使用する場合は信頼性がありません。
グローバル変数を使用する
Node は、グローバルな名前空間オブジェクトである
global
- このオブジェクトにアタッチしたものは、アプリ内のあらゆる場所で利用可能になります。そのため
index.js
(または
app.js
またはメインアプリの
というファイル名であれば、グローバル変数を定義すればよいのです。
// index.js
var path = require('path');
global.appRoot = path.resolve(__dirname);
// lib/moduleA/component1.js
require(appRoot + '/lib/moduleB/component2.js');
長所と短所
安定して動作するが、グローバル変数に依存する必要があるため、コンポーネントなどを簡単に再利用できない。
process.cwd()
現在の作業ディレクトリを返します。プロセスが起動されたディレクトリに完全に依存するため、まったく信頼できません。 から :
$ cd /home/demo/
$ mkdir subdir
$ echo "console.log(process.cwd());" > subdir/demo.js
$ node subdir/demo.js
/home/demo
$ cd subdir
$ node demo.js
/home/demo/subdir
アプリルートパス
この問題に対処するため、ノードモジュールに アプリルートパス . 使い方は簡単です。
const appRoot = require('app-root-path');
const myModule = require(`${ appRoot }/lib/my-module.js`);
は
app-root-path
モジュールは、グローバルにインストールされたモジュールを考慮して、アプリのルートパスを決定するためにいくつかのテクニックを使用します(たとえば、アプリが
/var/www/
にインストールされているが、モジュールは
~/.nvm/v0.x.x/lib/node/
). 100%うまくいくわけではありませんが、ほとんどの一般的なシナリオでうまくいくでしょう。
長所と短所
ほとんどの場合、設定なしで動作します。また、いくつかの便利なメソッドを追加で提供しています (プロジェクトページを参照)。最大の欠点は、次のような場合に動作しないことです。
- pm2 のようなランチャーを使用している場合
-
AND
の中にインストールされていない場合、このモジュールはアプリの
node_modules
ディレクトリにインストールした場合(例えば、グローバルにインストールした場合)。
を設定することで回避できます。
APP_ROOT_PATH
環境変数、または
.setPath()
を使用したほうがよいでしょう。
global
メソッドを使用します。
NODE_PATH環境変数
もし、あなたが
を決定します。
のルートパスは、上記のソリューションのいずれかが最も適していると思われます。一方、アプリのモジュールを確実にロードするための問題を解決したいのであれば
NODE_PATH
環境変数
ノードの
モジュールシステム
は、さまざまな場所でモジュールを探します。
これらの場所の1つは
process.env.NODE_PATH
点
. この環境変数を設定すると
require
のモジュールを、他の変更なしに、標準のモジュールローダーで読み込むことができます。
例えば
NODE_PATH
から
/var/www/lib
の場合、以下のようにすればうまくいくでしょう。
require('module2/component.js');
// ^ looks for /var/www/lib/module2/component.js
これを行うための素晴らしい方法は
npm
:
{
"scripts": {
"start": "NODE_PATH=. node app.js"
}
}
これで、アプリを
npm start
で、金メダルです。私はこれを
enforce-node-path
を使用せずに誤ってアプリを読み込むことを防止するモジュールです。
NODE_PATH
を設定します。環境変数の強制をさらに制御したい場合は
チェックエンブ
.
1つだけガッカリしたことがあります。
NODE_PATH
なければならない
決まる
外側
を使用します。のようなことはできません。
process.env.NODE_PATH = path.resolve(__dirname)
なぜなら、モジュール・ローダーは、アプリの実行前に検索するディレクトリのリストをキャッシュするからです。
[2016/4/6追記]です。 この問題を解決しようとする、もうひとつの有望なモジュールは 波状 .
関連
-
[解決済み】モジュール 'internal/util/types' が見つかりません。
-
[解決済み] nodejsでfindAllのソート順を続編にする
-
[解決済み] Node.jsを完全にアンインストールして、最初から再インストールする方法 (Mac OS X)
-
[解決済み] Node.jsのデプロイメント設定/構成ファイルを保存する方法は?
-
[解決済み] ローカルにインストールしたパッケージの実行ファイルを node_modules で使用するには?
-
[解決済み] nodeやExpressを使用してJSONを返す正しい方法
-
[解決済み] Node.jsでファイルを自動で再読み込みするには?
-
[解決済み】npmを使用してpackage.jsonの依存関係を現在のディレクトリにインストールするにはどうすればよいですか?
-
[解決済み】python: スクリプトの作業ディレクトリをスクリプト自身のディレクトリに変更する
-
[解決済み】Node.js fs.readdir 再帰的ディレクトリ検索
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Mongooseで、日付でソートするにはどうしたらいいですか?(node.js)
-
[解決済み】E11000重複キーエラー mongodb mongooseのインデックス
-
[解決済み] create-react-app、インストールエラー("コマンドが見つからない")。
-
[解決済み] MongoDB でコレクションを日付順に並べるには?
-
[解決済み] nodeファイルの先頭にある"/usr/bin/env node "は、具体的には何をするのですか?
-
[解決済み] nodejs - http.requestでresponse.writeを使用する場合、第一引数は文字列またはBufferでなければなりません。
-
[解決済み] のエラーが発生しました。これはおそらくnpmの問題ではありません。上に追加のログ出力があると思われます
-
[解決済み] エラーです。Ionic使用中にモジュール '../lib/utils/unsupported.js' が見つかりません。
-
[解決済み】node.jsのrequireをabsoluteにする方法は?(相対的な代わりに)
-
[解決済み】Gitで複数の作業ディレクトリを作成できますか?