2013-10-04 2 views
1

Я создаю инструмент, который является главным образом узлом. Этот инструмент можно установить глобально (с опцией -g) У меня есть несколько статических файлов в модуле для создания отчета. Если модуль вызывается локально, я могу ссылаться на статические файлы с относительным путем ./node_modules/<module>/static/filename. Но когда инструмент вызывается как команда, как я могу ссылаться на статические файлы? И как я могу определить, вызван ли инструмент как локальный модуль или как команда?Определение расположения модулей узла во время выполнения

ответ

2

Когда инструмент установлен глобально, то, как правило, две записи в системах Unix:

  • /usr/local/lib/node_modules/<module>/ -> каталог, содержащий все исходные модуль файлы
  • /usr/local/bin/<script.js> -> символическая к вашему модуль исполняемый скрипт

Поскольку Узел использует реальный путь (т. е. после того, как все символические ссылки были разрешены), чтобы разрешить путь относительно текущего модуля, вам не нужно беспокоиться о различиях между глобальной и локальной установкой.

Что вам нужно для обработки - это, возможно, другой текущий рабочий каталог, в котором выполняется процесс узла. Решение состоит в том, чтобы разрешить относительный путь к вашему статическому файлу против абсолютного пути, где находится ваш модуль, а не предполагать, что процесс узла будет выполняться в определенном каталоге, как в вашем примере.

Есть два способа для этого:

  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'); 
    
Смежные вопросы