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
설치하고 나머지는 로컬로 설치해야합니다. 이것에 대한 옵션이 있습니까?
새로운 참고 : 아마도이 작업을 원하지 않거나 필요로하지 않을 것입니다. 아마도 당신이하고 싶은 devDependencies
것은 package.json 섹션에 빌드 / 테스트 등에 대한 이러한 유형의 명령 의존성을 두는 것 입니다. package.json 에서 무언가를 사용할 때마다 scripts
node_modules / .bin에있는 devDependencies 명령이 마치 경로에있는 것처럼 작동합니다.
예를 들면 다음과 같습니다.
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
글로벌 노드 패키지 설치가 필요한 곳에 가장 일반적인 설정을 사용하는 경우 문제가있을 수 있습니다 sudo
. 한 가지 옵션은 npm
구성 을 변경하여 필요하지 않은 것입니다.
npm config set prefix ~/npm
에 $ HOME / npm / bin을 $ PATH에 추가 export PATH=$HOME/npm/bin:$PATH
하십시오 ~/.bashrc
.
아래 설명 된 단점으로 인해 허용 된 답변을 따르는 것이 좋습니다 .
다음
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
별명을 바로 가기로 제공했습니다 . 이 엔지니어 는이라는 쉘 스크립트를 사용합니다 env.sh
. 그러나 $(npm bin)
추가 파일이나 설정을 피하기 위해 직접 사용하는 것을 선호합니다 .
각 호출을 약간 더 크게 만들지 만 작동 하지 않아야합니다 .
- 글로벌 패키지와의 잠재적 인 종속성 충돌 (@nalply)
- 에 대한 필요성
sudo
- npm 접두사를 설정해야합니다 (어쨌든 하나를 사용하는 것이 좋습니다)
단점 :
$(npm bin)
Windows에서는 작동하지 않습니다.- 개발 트리에서 더 깊은 도구는
npm bin
폴더에 나타나지 않습니다 . ( npm-run 또는 npm을 설치하십시오 .)
Jason이 위에서 설명한 것처럼 일반적인 작업 (예 : 빌드 및 축소)을 '스크립트'섹션 에 배치 하는 것이 더 나은 솔루션 인 것 같습니다 .package.json
이것은 조금 낡았지만 요구 사항에 부딪 쳤으므로 여기에 내가 찾은 해결책이 있습니다.
문제 :
개발 팀은 AngularJS / Bootstrap으로 마이그레이션하는 많은 .NET 웹 응용 프로그램 제품을 유지 관리합니다. VS2010은 사용자 지정 빌드 프로세스에 쉽게 적합하지 않으며 개발자는 일상적으로 여러 제품 릴리스를 작업하고 있습니다. 우리의 VCS는 Subversion입니다 (나는 알고 있습니다. Git으로 이사하려고하지만 성가신 마케팅 직원이 너무 까다로워 요). 단일 VS 솔루션에는 여러 개의 별도 프로젝트가 포함됩니다. 직원들에게 동일한 노드 패키지 (걸프, 바우어 등)를 동일한 컴퓨터에 여러 번 설치할 필요없이 개발 환경을 초기화하는 일반적인 방법이 필요했습니다.
TL; DR :
.NET 제품에 대한 모든 로컬 필수 패키지뿐만 아니라 글로벌 Node / Bower 개발 환경을 설치하려면 "npm install"이 필요합니다.
글로벌 패키지는 아직 설치되지 않은 경우에만 설치해야합니다.
글로벌 패키지에 대한 로컬 링크는 자동으로 작성되어야합니다.
해결책:
우리는 이미 모든 개발자와 모든 제품이 공유하는 공통 개발 프레임 워크를 가지고 있으므로 필요할 때 글로벌 패키지를 설치하고 로컬 링크를 작성하는 NodeJS 스크립트를 작성했습니다. 이 스크립트는 제품 기본 폴더와 관련하여 ".... \ 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" : "bower@1.7.2",
"event-stream" : "event-stream@3.3.2",
"gulp" : "gulp@3.9.0",
"gulp-angular-templatecache" : "gulp-angular-templatecache@1.8.0",
"gulp-clean" : "gulp-clean@0.3.1",
"gulp-concat" : "gulp-concat@2.6.0",
"gulp-debug" : "gulp-debug@2.1.2",
"gulp-filter" : "gulp-filter@3.0.1",
"gulp-grep-contents" : "gulp-grep-contents@0.0.1",
"gulp-if" : "gulp-if@2.0.0",
"gulp-inject" : "gulp-inject@3.0.0",
"gulp-minify-css" : "gulp-minify-css@1.2.3",
"gulp-minify-html" : "gulp-minify-html@1.0.5",
"gulp-minify-inline" : "gulp-minify-inline@0.1.1",
"gulp-ng-annotate" : "gulp-ng-annotate@1.1.0",
"gulp-processhtml" : "gulp-processhtml@1.1.0",
"gulp-rev" : "gulp-rev@6.0.1",
"gulp-rev-replace" : "gulp-rev-replace@0.4.3",
"gulp-uglify" : "gulp-uglify@1.5.1",
"gulp-useref" : "gulp-useref@3.0.4",
"gulp-util" : "gulp-util@3.0.7",
"lazypipe" : "lazypipe@1.0.1",
"q" : "q@1.4.1",
"through2" : "through2@2.0.0",
/*---------------------------------------------------------------*/
/* 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();
};
이제 개발자를위한 전역 도구를 업데이트하려면 "packages"개체를 업데이트하고 새 스크립트를 체크인하십시오. 내 개발자는이를 확인하고 "노드 npm-setup.js"또는 개발중인 모든 제품에서 "npm install"로 실행하여 글로벌 환경을 업데이트합니다. 모든 것이 5 분이 걸립니다.
In addition, to configure the environment for the a new developer, they must first only install NodeJS and GIT for Windows, reboot their computer, check out the "Shared Files" folder and any products under development, and start working.
The "package.json" for the .NET product calls this script prior to install:
{
"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": {}
}
Notes
Note the script reference requires forward slashes even in a Windows environment.
"npm ls" will give "npm ERR! extraneous:" messages for all packages locally linked because they are not listed in the "package.json" "dependencies".
Edit 1/29/16
The updated npm-setup.js
script above has been modified as follows:
Package "version" in
var packages
is now the "package" value passed tonpm install
on the command line. This was changed to allow for installing packages from somewhere other than the registered repository.If the package is already installed but is not the one requested, the existing package is removed and the correct one installed.
For reasons unknown, npm will periodically throw an EBUSY error (-4082) when performing an install or link. This error is trapped and the command re-executed. The error rarely happens a second time and seems to always clear up.
All modules from package.json are installed to ./node_modules/
I couldn't find this explicitly stated but this is the package.json reference for NPM.
You could use a separate file, like npm_globals.txt
, instead of package.json
. This file would contain each module on a new line like this,
mongoose@1.4.0
node.io@0.3.3
jquery@1.5.1
jsdom@0.2.0
cron@0.1.2
Then in the command line run,
< npm_globals.txt xargs npm install -g
Check that they installed properly with,
npm list -g --depth=0
As for whether you should do this or not, I think it all depends on use case. For most projects, this isn't necessary; and having your project's package.json
encapsulate these tools and dependencies together is much preferred.
But nowadays I find that I'm always installing create-react-app
and other CLI's globally when I jump on a new machine. It's nice to have an easy way to install a global tool and its dependencies when versioning doesn't matter much.
And nowadays, I'm using npx
, an npm package runner, instead of installing packages globally.
Build your own script to install global dependencies. It doesn't take much. package.json is quite expandable.
const {execSync} = require('child_process');
JSON.parse(fs.readFileSync('package.json'))
.globalDependencies.foreach(
globaldep => execSync('npm i -g ' + globaldep)
);
Using the above, you can even make it inline, below!
Look at preinstall below:
{
"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": [
"cordova@8.1.2",
"ionic",
"potato"
],
"author": "author",
"license": "MIT",
"devDependencies": {
"chai": "^4.2.0",
"mocha": "^5.2.0"
},
"bin": {
"app": "app.js"
}
}
The authors of node may not admit package.json is a project file. But it is.
'Programing' 카테고리의 다른 글
백 스택에서 조각 onResume () 및 onPause ()가 호출되지 않습니다 (0) | 2020.05.19 |
---|---|
REST API 인증 (0) | 2020.05.19 |
코 루틴이란? (0) | 2020.05.19 |
범위 내의 모든 변수 가져 오기 (0) | 2020.05.19 |
var self = this? (0) | 2020.05.19 |