Как бы я получить путь к сценарию в Node.js?
Я знаю, что есть process.cwd
, но это относится только к каталогу, где был вызван скрипт, а не к самому скрипту. Например, скажем, я в/home/kyle/
и я запускаю следующую команду:
node /home/kyle/some/dir/file.js
Если я позвоню process.cwd()
, я получу /home/kyle/
, нет /home/kyle/some/dir/
. Есть ли способ получить этот каталог?
Ответы:
Я нашел это после просмотра документации снова. То, что я искал, это переменные уровня
__filename
и__dirname
модуля.__filename
Имя файла текущего модуля. Это разрешенный абсолютный путь к текущему файлу модуля. (например:/home/kyle/some/dir/file.js
)__dirname
Имя каталога текущего модуля. (например:/home/kyle/some/dir
)источник
__dirname.split(path.sep).pop()
require('path').basename(__dirname);
В общем, вы можете сделать это:
Используйте resol () вместо объединения с '/' или '\', иначе вы столкнетесь с кроссплатформенными проблемами.
Примечание: __dirname - это локальный путь модуля или включенного скрипта. Если вы пишете плагин, который должен знать путь основного скрипта, это:
или просто получить имя папки:
источник
var settings = require('./settings.json')
. Конечно, это синхронный fs IO, поэтому не делайте этого во время выполнения, но во время запуска все в порядке, и после загрузки он будет кэширован.Эта команда возвращает текущий каталог:
Например, чтобы использовать путь для чтения файла:
источник
cd /foo; node bar/test.js
, текущий каталог будет/foo
, но сценарий находится в/foo/bar/test.js
.text.txt
и он работал бы, вам не нужно составлять абсолютный путьИспользуйте __dirname !!
Имя каталога текущего модуля. Это так же, как path.dirname ()
__filename
.Пример: запуск узла example.js из / Users / mjr
https://nodejs.org/api/modules.html#modules_dirname
Для ESModules вы хотели бы использовать:
import.meta.url
источник
Когда дело доходит до основного скрипта, это так просто:
Из документации Node.js :
Если вам нужно знать путь к файлу модуля, используйте __filename .
источник
process.argv[1]
применяется только к основному сценарию, а__filename
указывает на исполняемый файл модуля. Я обновляю свой ответ, чтобы подчеркнуть разницу. Тем не менее, я не вижу ничего плохого в использованииprocess.argv[1]
. Зависит от своих требований.Node.js 10 поддерживает модули ECMAScript , где
__dirname
и__filename
больше не доступны .Затем, чтобы получить путь к текущему модулю ES , нужно использовать:
А для каталога, содержащего текущий модуль:
источник
--experimental-modules
флагом.источник
__dirname
больше не работает с модулями ES .Каждая программа Node.js имеет несколько глобальных переменных в своей среде, которые представляют некоторую информацию о вашем процессе, и одна из них
__dirname
.источник
__dirname
но и с модулями ES .Я знаю, что это довольно старый вопрос, и исходный вопрос, на который я отвечал, помечен как дубликат и направлен сюда, но я столкнулся с проблемой, пытавшейся заставить журналистов-жасминов работать, и мне не понравилась идея, что мне пришлось понизить рейтинг для того чтобы он работал. Я обнаружил, что jasmine-reporters неправильно разрешал savePath и фактически помещал выходные данные папки отчетов в каталог jasmine-reporters вместо корневого каталога, в котором я запускал gulp. Для правильной работы я в конечном итоге использовал process.env.INIT_CWD, чтобы получить исходный текущий рабочий каталог, который должен быть каталогом, в котором вы запустили gulp. Надеюсь, это кому-нибудь поможет.
источник
Вы можете использовать process.env.PWD, чтобы получить текущий путь к папке приложения.
источник
Если вы используете
pkg
для упаковки своего приложения, вы найдете полезным это выражение:process.pkg
говорит , если приложение было упакованоpkg
.process.execPath
содержит полный путь к исполняемому файлу, который/usr/bin/node
аналогичен прямому вызову scripts (node test.js
) или упакованного приложения.require.main.filename
содержит полный путь основного скрипта, но он пуст, когда Node работает в интерактивном режиме.__dirname
содержит полный путь к текущему сценарию, поэтому я не использую его (хотя это может быть тем, что запрашивает OP; тогда лучше использовать,appDirectory = process.pkg ? require('path').dirname(process.execPath) : (__dirname || require('path').dirname(process.argv[0]));
отметив, что в интерактивном режиме__dirname
пусто.В интерактивном режиме используйте либо
process.argv[0]
для получения пути к исполняемому файлу Node, либоprocess.cwd()
для получения текущего каталога.источник
Используйте
basename
методpath
модуля:Вот документация, из которой взят пример выше.
Как отметил Дэн, Node работает над модулями ECMAScript с флагом --experimental-modules. Узел 12 все еще поддерживает
__dirname
и__filename
как указано выше.Если вы используете
--experimental-modules
флаг, есть альтернативный подход .Альтернативой является получение пути к текущему модулю ES :
А для каталога, содержащего текущий модуль:
источник
Если вы хотите что-то более похожее на $ 0 в сценарии оболочки, попробуйте это:
источник
__dirname
и не__filename
могут больше не доступны с модулями ES .