Как установить пользовательское расположение для локальной установки пакета npm?

177

Можно ли указать пользовательский пункт назначения пакета npm install, либо с помощью флага команды или переменной среды?

По умолчанию локальная установка npm заканчивается в node_modulesтекущем каталоге, но я хочу, чтобы он устанавливался в node_modulesдругом каталоге, например vendor/node_modules. Как я могу это сделать?

PJE
источник
Что вы пытаетесь достичь? это обсуждалось здесь: stackoverflow.com/questions/13668097/…
Паскаль Беллонкл
10
@PascalBelloncle: Вместо установки пакетов в подкаталоги ./node_modules, я хочу, чтобы npm устанавливал их в подкаталоги ./vendor/node_modules. (Или нужно сказать, что это не настраивается.)
pje
1
Я понял, что это то, что вы хотите сделать, что я не думаю, что это возможно из коробки. Плюс требовать тоже не получится. Поэтому я спрашивал, почему ты хотел это сделать. Может быть, есть альтернативное решение, чтобы делать то, что вы хотите.
Паскаль Беллонкл
1
Я устанавливаю пакет исключительно для его двоичного файла (то есть он будет использоваться только в командной строке и никогда не будет required), но я не хочу устанавливать его глобально.
pje
Понимаю. Смотрите мое предложение ниже.
Паскаль Беллонкл

Ответы:

180

TL; DR

Вы можете сделать это, используя --prefixфлаг и --globalфлаг *.

pje@friendbear:~/foo $ npm install bower -g --prefix ./vendor/node_modules
bower@0.7.0 /Users/pje/foo/vendor/node_modules/bower

* Несмотря на то, что это «глобальная» установка, установленные корзины не будут доступны через командную строку, если они не ~/foo/vendor/node_modulesсуществуют вPATH .

TL, R

Каждый настраиваемый атрибут npmможет быть установлен в любом из шести разных мест. В порядке приоритета:

  • Флаги командной строки: --prefix ./vendor/node_modules
  • Переменные среды: NPM_CONFIG_PREFIX=./vendor/node_modules
  • Файл конфигурации пользователя: $HOME/.npmrcили userconfigparam
  • Глобальный файл конфигурации: $PREFIX/etc/npmrcили userconfigparam
  • Встроенный файл конфигурации: path/to/npm/itself/npmrc
  • Конфигурация по умолчанию: node_modules / npmconf / config-defs.js

По умолчанию локально установленные пакеты входят в ./node_modules. глобальные идут в prefixпеременную config ( /usr/localпо умолчанию).

Вы можете запустить, npm config listчтобы увидеть ваш текущий конфиг и npm config editизменить его.

PS

В целом, npmдокументация действительно полезна. Раздел папок - хороший структурный обзор npm, а раздел config отвечает на этот вопрос.

PJE
источник
2
Как я тестирую, на самом деле, если следовать приведенной выше команде, она будет установлена ​​на ./vendor/node_modules/lib/bowerиспользованиеnpm#3.8.0
e-cloud
2
При этом я получаю сообщение об ошибкеNo version provided in package.json
FooBar
Ты пишешь bins won't be accessible through the command line. Программа, конечно, может быть запущена с использованием полного пути npm install eslint@3.4.0 -g --prefix c:\my_npm` calling c: \ my_npm \ eslint --fix my.js`
Бернхард Доблер,
13
Можно ли добиться чего-то похожего с файлом package.json? то есть, если я запускаю npm installв каталоге A с файлом package.json, пакеты будут устанавливаться в каталог B. Похоже, это решение для установки отдельных пакетов.
Райан-Нил Мес
1
Есть ли способ установить все зависимости с помощью этого метода? npm installустанавливает зависимости локально. npm install X -g -prefix "..."устанавливает модуль X в префикс, npm install -g -prefix "..."устанавливает текущий пакет в префикс.
AnnanFay
28

Если вы хотите это в config, вы можете установить npm config следующим образом:

npm config set prefix "$(pwd)/vendor/node_modules"

или

npm config set prefix "$HOME/vendor/node_modules"

Проверьте ваш конфиг с

npm config ls -l

Или как говорит @pje и использовать --prefixфлаг

Rimian
источник
4
Я считаю, что это устанавливает глобальный префикс? Таким образом, npm installвсе равно будет установлена ​​локально, ./node_modulesно npm install -gбудет установлена "$(pwd)/vendor/node_modules". Я могу представить себе настройки, а потом забыть об этом, а потом вернуться и спросить, почему мои глобальные пакеты работают странно.
AnnanFay
13

Для OSX вы можете перейти к вашему пользователю $HOME(вероятно / Users / ваше имя /) и, если он еще не существует, создать.npmrc файл (файл, который npm использует для конфигурации пользователя), и создать каталог для ваших пакетов npm, чтобы быть установленным в (например, / Users / yourname / npm). В этом файле .npmrc установите «prefix» для нового каталога npm, в котором будут установлены «глобально» установленные пакеты npm; Эти «глобальные» пакеты, очевидно, будут доступны только вашей учетной записи.

В .npmrc:

prefix=${HOME}/npm

Затем выполните эту команду из командной строки:

npm config ls -l

Он должен выводить как вашу собственную локальную конфигурацию, так и глобальную конфигурацию npm, и вы должны увидеть отраженную конфигурацию локального префикса, возможно, в верхней части длинного списка выходных данных.

В целях безопасности я рекомендую этот подход к настройке поведения npm вашей учетной записи, а не к настройке /usr/local папок, что я рекомендовал в других местах.

Райан
источник
9

Например, в Windows 7 можно использовать следующий набор команд / операций.

Создайте личную переменную среды, двойные обратные слеши обязательны:

  • Имя переменной: %NPM_HOME%
  • Значение переменной: C:\\SomeFolder\\SubFolder\\

Теперь установите значения конфигурации для новых папок (примерные имена файлов):

  • Установите папку npm

npm config set prefix "%NPM_HOME%\\npm"

  • Установите папку npm-cache

npm config set cache "%NPM_HOME%\\npm-cache"

  • Установить временную папку npm

npm config set tmp "%NPM_HOME%\\temp"

При желании вы можете удалить содержимое исходных папок до изменения конфигурации.

  • Удалить npm-кеш npm cache clear

  • Список модулей npm npm -g ls

  • Удалить модули npm npm -g rm name_of_package1 name_of_package2

MichaelHuelsen
источник
1
Спасибо, я следую за шагами. Но он создает каталог с именем c: /% NPM_HOME% / npm и т. Д. Вместо c: / npm_home / npm
Jay
6

После того, как я сам искал, что хочу, чтобы несколько проектов с общими зависимостями были DRYer, я обнаружил:

  • Локальная установка - это способ Node для всего, что вы хотите использовать через require()
  • Глобальная установка предназначена для двоичных файлов, которые вы хотите найти на своем пути, но не предназначена для чего-либо через require()
  • Использование префикса означает, что вам нужно добавить соответствующие binи manпути к$PATH
  • npm link( info ) позволяет вам использовать локальную установку в качестве источника для глобалов

→ придерживайтесь пути Node и устанавливайте локально

ссылка:

Оли Студхолм
источник