Установите зависимости глобально и локально с помощью package.json
Используя npm, мы можем установить модули глобально, используя опцию -g
. Как это сделать в файле package.json?
Предположим, что это мои зависимости в файле package.json
"dependencies": {
"mongoose": "1.4.0",
"node.io" : "0.3.3",
"jquery" : "1.5.1",
"jsdom" : "0.2.0",
"cron" : "0.1.2"
}
Когда я запускаю npm install
, я хочу, чтобы только node.io
устанавливался глобально, остальные остальные должны быть установлены локально. Есть ли возможность для этого?
Ответы
Ответ 1
Новое примечание: Вы, вероятно, не хотите или не должны этого делать. То, что вы, вероятно, захотите сделать, это просто установить эти типы зависимостей команд для сборки/тестирования и т.д. В разделе devDependencies
вашего package.json. В любое время, когда вы используете что-то из scripts
в package.json, команды devDependencies (в node_modules/. bin) действуют так, как будто они находятся на вашем пути.
Например:
npm i --save-dev mocha # Install test runner locally
npm i --save-dev babel # Install current babel locally
Затем в package.json:
// devDependencies has mocha and babel now
"scripts": {
"test": "mocha",
"build": "babel -d lib src",
"prepublish": "babel -d lib src"
}
Затем в командной строке вы можете запустить:
npm run build # finds babel
npm test # finds mocha
npm publish # will run babel first
Но если вы действительно хотите установить глобально, вы можете добавить предварительную установку в разделе сценариев package.json:
"scripts": {
"preinstall": "npm i -g themodule"
}
Итак, на самом деле моя установка npm запускает npm install снова.., что странно, но, похоже, работает.
Примечание. у вас могут возникнуть проблемы, если вы используете наиболее распространенную установку для npm
, где требуется установка пакета Node sudo
. Один из вариантов заключается в изменении конфигурации npm
, поэтому это необязательно:
npm config set prefix ~/npm
, добавьте $HOME/npm/bin в $PATH, добавив export PATH=$HOME/npm/bin:$PATH
к вашему ~/.bashrc
.
Ответ 2
Из-за недостатков, описанных ниже, я бы рекомендовал следовать принятому ответу:
Используйте npm install --save-dev [package_name]
, затем выполните сценарии с помощью:
$ npm run lint
$ npm run build
$ npm test
Ниже следует мой оригинальный, но не рекомендуемый ответ.
Вместо использования глобальной установки вы можете добавить пакет к вашему devDependencies
(--save-dev
), а затем запустить двоичный файл из любого места в вашем проекте:
"$(npm bin)/<executable_name>" <arguments>...
В вашем случае:
"$(npm bin)"/node.io --help
Этот инженер предоставил псевдоним npm-exec
в качестве ярлыка. Этот инженер использует shellscript под названием env.sh
. Но я предпочитаю использовать $(npm bin)
напрямую, чтобы избежать лишнего файла или настройки.
Несмотря на то, что каждый вызов немного больше, он должен просто работать, предотвращая:
- конфликты потенциальной зависимости с глобальными пакетами (@nalply)
- необходимость
sudo
- необходимо настроить префикс npm (хотя я рекомендую использовать его в любом случае)
Недостатки:
-
$(npm bin)
не будет работать в Windows.
- Инструменты, более глубокие в вашем дереве dev, не будут отображаться в папке
npm bin
. (Установите npm-run или npm-which в найти их.)
Кажется, что лучшее решение состоит в том, чтобы размещать общие задачи (например, создание и минимизацию) в разделе "scripts" /a > вашего package.json
, как показывает Джейсон выше.
Ответ 3
Это немного устарело, но я столкнулся с требованием, поэтому вот решение, которое я придумал.
Проблема:
Наша команда разработчиков поддерживает множество продуктов веб-приложений .NET, которые мы переносим на AngularJS/Bootstrap. VS2010 не легко поддается процессам пользовательской сборки, и мои разработчики регулярно работают над несколькими выпусками наших продуктов. Наш VCS - это Subversion (я знаю, я знаю. Я пытаюсь перейти на Git, но мой противный маркетинговый персонал настолько требовательный), и одно решение VS будет включать в себя несколько отдельных проектов. Мне нужен был мой штат, чтобы иметь общий метод инициализации своей среды разработки без необходимости устанавливать те же пакеты Node (gulp, bower и т.д.) Несколько раз на одном компьютере.
TL; ДР:
-
Нужно установить "npm install" для установки глобальной среды разработки Node/Bower, а также всех локально необходимых пакетов для продукта .NET.
-
Глобальные пакеты должны быть установлены только в том случае, если они еще не установлены.
-
Локальные ссылки на глобальные пакеты должны создаваться автоматически.
Решение:
У нас уже есть общая инфраструктура разработки, совместно используемая всеми разработчиками и всеми продуктами, поэтому я создал NodeJS script для установки глобальных пакетов по мере необходимости и создания локальных ссылок. script находится в папке "....\SharedFiles" относительно папки базы данных продукта:
/*******************************************************************************
* $Id: npm-setup.js 12785 2016-01-29 16:34:49Z sthames $
* ==============================================================================
* Parameters: 'links' - Create links in local environment, optional.
*
* <p>NodeJS script to install common development environment packages in global
* environment. <c>packages</c> object contains list of packages to install.</p>
*
* <p>Including 'links' creates links in local environment to global packages.</p>
*
* <p><b>npm ls -g --json</b> command is run to provide the current list of
* global packages for comparison to required packages. Packages are installed
* only if not installed. If the package is installed but is not the required
* package version, the existing package is removed and the required package is
* installed.</p>.
*
* <p>When provided as a "preinstall" script in a "package.json" file, the "npm
* install" command calls this to verify global dependencies are installed.</p>
*******************************************************************************/
var exec = require('child_process').exec;
var fs = require('fs');
var path = require('path');
/*---------------------------------------------------------------*/
/* List of packages to install and 'from' value to pass to 'npm */
/* install'. Value must match the 'from' field in 'npm ls -json' */
/* so this script will recognize a package is already installed. */
/*---------------------------------------------------------------*/
var packages =
{
"bower" : "[email protected]",
"event-stream" : "[email protected]",
"gulp" : "[email protected]",
"gulp-angular-templatecache" : "[email protected]",
"gulp-clean" : "[email protected]",
"gulp-concat" : "[email protected]",
"gulp-debug" : "[email protected]",
"gulp-filter" : "[email protected]",
"gulp-grep-contents" : "[email protected]",
"gulp-if" : "[email protected]",
"gulp-inject" : "[email protected]",
"gulp-minify-css" : "[email protected]",
"gulp-minify-html" : "[email protected]",
"gulp-minify-inline" : "[email protected]",
"gulp-ng-annotate" : "[email protected]",
"gulp-processhtml" : "[email protected]",
"gulp-rev" : "[email protected]",
"gulp-rev-replace" : "[email protected]",
"gulp-uglify" : "[email protected]",
"gulp-useref" : "[email protected]",
"gulp-util" : "[email protected]",
"lazypipe" : "[email protected]",
"q" : "[email protected]",
"through2" : "[email protected]",
/*---------------------------------------------------------------*/
/* fork of 0.2.14 allows passing parameters to main-bower-files. */
/*---------------------------------------------------------------*/
"bower-main" : "git+https://github.com/Pyo25/bower-main.git"
}
/*******************************************************************************
* run */
/**
* Executes <c>cmd</c> in the shell and calls <c>cb</c> on success. Error aborts.
*
* Note: Error code -4082 is EBUSY error which is sometimes thrown by npm for
* reasons unknown. Possibly this is due to antivirus program scanning the file
* but it sometimes happens in cases where an antivirus program does not explain
* it. The error generally will not happen a second time so this method will call
* itself to try the command again if the EBUSY error occurs.
*
* @param cmd Command to execute.
* @param cb Method to call on success. Text returned from stdout is input.
*******************************************************************************/
var run = function(cmd, cb)
{
/*---------------------------------------------*/
/* Increase the maxBuffer to 10MB for commands */
/* with a lot of output. This is not necessary */
/* with spawn but it has other issues. */
/*---------------------------------------------*/
exec(cmd, { maxBuffer: 1000*1024 }, function(err, stdout)
{
if (!err) cb(stdout);
else if (err.code | 0 == -4082) run(cmd, cb);
else throw err;
});
};
/*******************************************************************************
* runCommand */
/**
* Logs the command and calls <c>run</c>.
*******************************************************************************/
var runCommand = function(cmd, cb)
{
console.log(cmd);
run(cmd, cb);
}
/*******************************************************************************
* Main line
*******************************************************************************/
var doLinks = (process.argv[2] || "").toLowerCase() == 'links';
var names = Object.keys(packages);
var name;
var installed;
var links;
/*------------------------------------------*/
/* Get the list of installed packages for */
/* version comparison and install packages. */
/*------------------------------------------*/
console.log('Configuring global Node environment...')
run('npm ls -g --json', function(stdout)
{
installed = JSON.parse(stdout).dependencies || {};
doWhile();
});
/*--------------------------------------------*/
/* Start of asynchronous package installation */
/* loop. Do until all packages installed. */
/*--------------------------------------------*/
var doWhile = function()
{
if (name = names.shift())
doWhile0();
}
var doWhile0 = function()
{
/*----------------------------------------------*/
/* Installed package specification comes from */
/* 'from' field of installed packages. Required */
/* specification comes from the packages list. */
/*----------------------------------------------*/
var current = (installed[name] || {}).from;
var required = packages[name];
/*---------------------------------------*/
/* Install the package if not installed. */
/*---------------------------------------*/
if (!current)
runCommand('npm install -g '+required, doWhile1);
/*------------------------------------*/
/* If the installed version does not */
/* match, uninstall and then install. */
/*------------------------------------*/
else if (current != required)
{
delete installed[name];
runCommand('npm remove -g '+name, function()
{
runCommand('npm remove '+name, doWhile0);
});
}
/*------------------------------------*/
/* Skip package if already installed. */
/*------------------------------------*/
else
doWhile1();
};
var doWhile1 = function()
{
/*-------------------------------------------------------*/
/* Create link to global package from local environment. */
/*-------------------------------------------------------*/
if (doLinks && !fs.existsSync(path.join('node_modules', name)))
runCommand('npm link '+name, doWhile);
else
doWhile();
};
Теперь, если я хочу обновить глобальный инструмент для наших разработчиков, я обновляю объект "пакеты" и проверяю новый script. Мои разработчики проверяют это и запускают его с помощью "node npm-setup.js" или "npm install" из любого из разрабатываемых продуктов для обновления глобальной среды. Все это занимает 5 минут.
Кроме того, чтобы настроить среду для нового разработчика, они должны сначала установить только NodeJS и Git для Windows, перезагрузить их компьютер, проверить папку "Общие файлы" и любые разрабатываемые продукты и начать работу.
"package.json" для продукта .NET вызывает этот script до установки:
{
"name" : "Books",
"description" : "Node (npm) configuration for Books Database Web Application Tools",
"version" : "2.1.1",
"private" : true,
"scripts":
{
"preinstall" : "node ../../SharedFiles/npm-setup.js links",
"postinstall" : "bower install"
},
"dependencies": {}
}
Примечания
-
Обратите внимание, что ссылка script требует косой черты даже в Windows
окружающая среда.
-
"npm ls" даст сообщение "npm ERR! extraneous:" для всех пакетов
локально связаны, потому что они не указаны в "package.json"
"зависимость".
Изменить 1/29/16
Обновленный npm-setup.js
script выше был изменен следующим образом:
-
Пакет "версия" в var packages
теперь представляет собой значение "package", переданное в npm install
в командной строке. Это было изменено для установки пакетов из другого места, кроме зарегистрированного репозитория.
-
Если пакет уже установлен, но не тот, который был запрошен, существующий пакет будет удален и будет установлен правильный.
-
По неизвестным причинам npm будет периодически вызывать ошибку EBUSY (-4082) при выполнении установки или ссылки. Эта ошибка попадает в ловушку, и команда повторно выполняется. Ошибка редко случается во второй раз и, кажется, всегда проясняется.
Ответ 4
Все модули из package.json установлены на. / node_modules/
Я не мог найти это явно сформулированным, но это ссылка package.json для NPM.
Ответ 5
Вы можете использовать отдельный файл, например, npm_globals.txt
, а не package.json
. Этот файл будет содержать каждый модуль в новой строке, как это,
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
Затем в командной строке запустите,
< npm_globals.txt xargs npm install -g
Проверьте, правильно ли они установлены,
npm list -g --depth=0
Что касается того, следует ли вам делать это или нет, я думаю, что все зависит от варианта использования. Для большинства проектов это не обязательно; и ваш package.json
инкапсулирует эти инструменты и зависимости вместе, очень предпочтительно.
Но в настоящее время я обнаруживаю, что я всегда устанавливаю create-react-app
и другие CLI глобально, когда я прыгаю на новую машину. Приятно иметь простой способ установки глобального инструмента и его зависимостей, когда управление версиями не имеет большого значения.
И в настоящее время я использую npx
, программу запуска пакетов npm, вместо того, чтобы устанавливать пакеты глобально.
Ответ 6
Создайте свой собственный скрипт для установки глобальных зависимостей. Это не займет много. package.json достаточно расширяемый.
const {execSync} = require('child_process');
JSON.parse(fs.readFileSync('package.json'))
.globalDependencies.foreach(
globaldep => execSync('npm i -g ' + globaldep)
);
Используя вышеупомянутое, вы можете даже сделать это встроенным, ниже!
Посмотрите на preinstall ниже:
{
"name": "Project Name",
"version": "0.1.0",
"description": "Project Description",
"main": "app.js",
"scripts": {
"preinstall": "node -e \"const {execSync} = require('child_process'); JSON.parse(fs.readFileSync('package.json')).globalDependencies.foreach(globaldep => execSync('npm i -g ' + globaldep));\"",
"build": "your transpile/compile script",
"start": "node app.js",
"test": "./node_modules/.bin/mocha --reporter spec",
"patch-release": "npm version patch && npm publish && git add . && git commit -m \"auto-commit\" && git push --follow-tags"
},
"dependencies": [
},
"globalDependencies": [
"[email protected]",
"ionic",
"potato"
],
"author": "author",
"license": "MIT",
"devDependencies": {
"chai": "^4.2.0",
"mocha": "^5.2.0"
},
"bin": {
"app": "app.js"
}
}
Авторы узла могут не допустить package.json - файл проекта. Но это.