Установка "глобальных" npm-зависимостей через package.json

У меня есть несколько "глобальных" зависимостей (jshint, csslint, buster и т.д.), которые я хотел бы автоматически установить и выполнить через командную строку, когда мой пакет установлен через npm install. Возможно ли это?

В настоящее время я делаю следующее вручную:

  • npm install -g <package_name>
  • из моего проекта: npm link <package_name>

Обновление: Просто наткнулся на этот запрос функции для npm. Кажется, что scripts config внутри package.json - это способ пойти?

Обновление снова: Или, прочитав npm docs, возможно, я должен использовать .gyp файл? Я в замешательстве.

Ответ 1

Невозможно указать зависимости как "глобальные" из package.json. И это по дизайну, так как Isaac заявляет в этом запросе на функцию, на который вы ссылаетесь:

Да, мы никогда не будем это делать.

Но "бинарные файлы" все еще могут использоваться, когда пакет установлен локально. Они будут в .../node_modules/.bin/. И вы должны быть в состоянии поставить их в очередь с помощью preinstall script.

Хотя, если серия команд довольно длинная (как предполагают "jshint, csslint, buster и т.д." ), вы можете захотеть изучить инструмент построения, например grunt для выполнения различных задач:

{
    // ...,

    "scripts": {
        "preinstall": "grunt"
    }
}

Ответ 2

Мне очень нравится шаблон, в котором вы устанавливаете локальные зависимости, а затем используйте bash script, который устанавливает ваш PATH в ./node_modules/.bin.

Файл: env.sh

# Add your local node_modules bin to the path for this command
export PATH="./node_modules/.bin:$PATH"

# execute the rest of the command
exec "[email protected]"

Затем вы можете использовать этот script перед любой командой bash. Если вы соедините это с Makefile или npm script:

Файл: Makefile

lint :
    ./env.sh csslint my_styles

Файл: package.json

"scripts": {
  "lint": "./env.sh csslint my_styles"
}

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

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

Ответ 3

Вы должны попробовать следующее: https://github.com/lastboy/package-script

Я использую его для установки глобальных пакетов npm прямо из package.json. Он хорошо работает для клиентов, которые не являются технически грамотными.

Он даже проверяет, установлены ли пакеты, если они не установлены!