Чтобы узнать каталог, который использует npm-скрипт на вашем Mac, определите, к какому пакету относится скрипт, а затем выведите каталог прямо из этого скрипта. npm запускает скрипт из папки его пакета, даже если вы вызываете npm run из другого места. В проекте с рабочими пространствами (workspaces) нужной папкой может быть выбранный пакет рабочей области. Шаги ниже помогут вам определить точный путь и отличить его от папки, где вы ввели команду.
1. Найдите запускаемый пакет и скрипт
Откройте Терминал и перейдите в папку проекта, где вы обычно запускаете npm. По умолчанию в Терминале macOS используется zsh, хотя командную оболочку можно изменить. Используйте pwd, чтобы отобразить текущий каталог, а затем выведите список файлов, чтобы проверить, содержит ли эта папка файл package.json. В руководстве Apple по Терминалу объясняется, как вводить команды в Терминале и использовать такие утилиты, как ls.
pwd
ls
Если вы не уверены, какой пакет определяет скрипт, изучите package.json в текущей папке. Вы можете вывести его с помощью cat package.json или открыть в текстовом редакторе. Найдите имя скрипта внутри объекта scripts. Например, в "scripts": { "build": "node build.js" } именем запускаемого скрипта является build. Не предполагайте сразу, что скрипт принадлежит корневой папке проекта, если это репозиторий с рабочими пространствами.
2. Проверьте ожидаемый рабочий каталог npm
В актуальных версиях npm скрипты запускаются из корневого каталога папки пакета, независимо от того, из какого каталога вы вызвали npm run. В стандартном проекте это папка, содержащая package.json данного пакета. В проекте с рабочими пространствами npm может запускать скрипт в контексте выбранного пространства; проверять нужно именно пакет этой рабочей области. См. документацию npm о рабочих каталогах скриптов и запуске скриптов в рабочих пространствах.
Это задокументированное поведение — хорошая отправная точка, но если скрипт меняет каталоги внутри себя или вам нужно подтвердить то, что видит конкретная команда, выведите путь во время выполнения. Команда оболочки, такая как cd, внутри скрипта может изменить каталог для последующих команд, поэтому одна лишь папка пакета может не отражать всей картины.
3. Выведите каталог изнутри скрипта
Самый надежный способ проверки — временно добавить pwd в начало команды скрипта в package.json. Например, замените:
"build": "node build.js"
на:
"build": "pwd && node build.js"
Затем запустите скрипт как обычно:
npm run build
Путь, выведенный перед командой сборки, и является рабочим каталогом оболочки в этот момент. В этой диагностике используется &&, поэтому node build.js запустится только в том случае, если pwd завершится успешно. После проверки удалите диагностический префикс и верните исходную команду. Если в исходном скрипте уже используются операторы оболочки, кавычки или команда-обертка, просмотрите файл перед сохранением; сохраняйте задуманный порядок и синтаксис.
Если скрипт представляет собой файл Node.js и у вас есть возможность его отредактировать, еще один прямой способ проверки — временно добавить console.log(process.cwd()) ближе к его началу. В документации Node указано, что process.cwd() возвращает текущий рабочий каталог процесса Node.js. Это выведет каталог, который видит Node в момент выполнения строки; если программа позже изменит свой рабочий каталог, значение может измениться.
4. Оцените результат и учтите рабочие пространства
Сравните выведенный путь с путем, который показала команда pwd перед запуском npm. Они могут различаться: каталог скрипта npm — это корень пакета, тогда как ваш каталог в Терминале — это место, откуда вы запустили команду. Например, если Терминал открыт в корне репозитория, но вы запускаете скрипт, определенный пакетом в packages/site, контекстом пакета для скрипта может быть эта рабочая область. В документации npm описан выбор области с помощью --workspace; вы также можете запустить скрипт непосредственно из каталога рабочей области.
npm run build --workspace=site
Используйте имя или путь к рабочей области, соответствующий конфигурации workspaces проекта. Если вывод оказался неожиданным, убедитесь, что вы выбрали правильный скрипт и рабочую область, затем проверьте, не содержит ли сам скрипт команду cd и не вызывает ли он другую утилиту, меняющую каталоги. Дочерний процесс также может иметь собственные настройки рабочего каталога; проверьте конфигурацию этого инструмента, если его поведение отличается от родительского скрипта.
О чем говорит INIT_CWD
npm предоставляет переменную INIT_CWD, содержащую каталог, в котором вы находились при вызове npm run. Это значение может помочь, когда скрипту необходимо знать, откуда был произведен вызов, но оно не является текущим рабочим каталогом скрипта. Используйте pwd внутри скрипта оболочки или process.cwd() внутри Node.js, чтобы проверить каталог, видимый выполняемому процессу. Это различие особенно важно, если относительный путь к файлу работает при запуске из одного места, но не работает из другого.
Для быстрой диагностики начните с правила корня пакета npm, при необходимости выберите нужную рабочую область и выведите pwd внутри скрипта, чтобы подтвердить фактический путь в момент его выполнения.
Источники
Scripts — Документация npm
Workspaces — Документация npm
Process — Node.js
Выполнение команд и запуск утилит в приложении «Терминал» на Mac — Служба поддержки Apple
Изменение используемой по умолчанию оболочки в приложении «Терминал» на Mac — Служба поддержки Apple