1

基本的にnode.jsモジュールであるツールを構築しています。このツールはグローバルにインストールできます (-gオプションあり) レポートを生成するためのモジュールに静的ファイルがほとんどありません。モジュールがローカルで呼び出された場合、静的ファイルを相対パスで参照できます./node_modules/<module>/static/filename。しかし、ツールがコマンドとして呼び出された場合、静的ファイルを参照するにはどうすればよいでしょうか? また、ツールがローカル モジュールとして呼び出されたのか、コマンドとして呼び出されたのかを判断するにはどうすればよいですか?

4

2 に答える 2

3

ツールがグローバルにインストールされている場合、通常、Unix システムには次の 2 つのエントリがあります。

  • /usr/local/lib/node_modules/<module>/-> すべてのモジュール ソース ファイルを含むディレクトリ
  • /usr/local/bin/<script.js>-> モジュールの実行可能スクリプトへのシンボリックリンク

Node は実際のパス (つまり、すべてのシンボリック リンクが解決された後) を使用して現在のモジュールに対する相対パスを解決するため、グローバル インストールとローカル インストールの違いについて心配する必要はありません。

処理する必要があるのは、ノード プロセスが実行されている現在の作業ディレクトリとは異なる可能性があることです。解決策は、モジュールが存在する絶対パスに対して静的ファイルへの相対パスを解決することです。例のようにノードプロセスが特定のディレクトリで実行されるとは想定していません。

それには 2 つの方法があります。

  1. 現在のソース ファイルのディレクトリ名 (パス) を含む__dirname( API docs )を使用します。

    var path = require('path');
    // assuming this script is in package root directory
    var staticFile = path.resolve(__dirname, 'static', 'filename');
    // if the script is in lib/ subdirectory, then you want to call
    var staticFile = path.resolve(__dirname, '..', 'static', 'filename');
    
  2. を使用require.resolve()すると、 の呼び出しで使用されるのとまったく同じファイル名が返されますrequire()

    // assuming this script is in package root directory
    var staticFile = require.resolve('./static/filename');
    // if the script is in lib/ subdirectory, then you want to call
    var staticFile = require.resolve('../static/filename');
    
于 2013-10-04T14:30:04.353 に答える