npm install - preserve existing files in node_modules - node.js

I have taken over a NodeJS project where, for convenience, some symlinks have been placed in the node_modules directory, which has been version controlled (just with the symlinks, not with any packages).
Upon running npm install to install the packages, the entire directory is replaced and those files are deleted, causing the script that runs after the install to fail as it depends on those files existing.
"dependencies": {},
"scripts": {
"prepublish": "deployment/prepublish"
},
"devDependencies": {
"browserify": "^9.0.8",
"bulk-require": "^0.2.1",
"bulkify": "^1.1.1",
"deasync": "^0.1.4",
"del": "^1.1.1",
"gulp": "^3.8.11",
"gulp-angular-gettext": "^2.1.0",
"gulp-compass": "^2.0.4",
"gulp-concat": "^2.5.2",
"gulp-merge": "^0.1.0",
"gulp-replace": "^0.5.3",
"gulp-rev-all": "^0.8.18",
"gulp-uglify": "^1.2.0",
"gulp-util": "^3.0.4",
"gulp-watch": "^4.2.4",
"jshint": "*",
"lodash": "*",
"merge-stream": "^0.1.7",
"q": "*",
"request": "*",
"run-sequence": "^1.0.2",
"stringify": "^3.1.0",
"vinyl-buffer": "^1.0.0",
"vinyl-source-stream": "^1.1.0",
"vinyl-transform": "^1.0.0"
}
How do I ensure that these files are preserved upon npm install? I know for a fact this used to work in earlier versions of npm but I haven't seen anything in the changelogs.
NodeJS Version = v5.4.1
NPM Version = 3.3.12
Thanks in advance for the help!

When npm install is run, it will examine the package.json file and attempt to install any dependencies listed that are not already installed to the node_modules directory. If there are no dependencies listed, it replaces the entire node_modules directory.
To preserve the files in the node_modules directory, you can do the following:
Install a module and have it added to the dependencies list in the package.json.
Move the symlink files into the module's folder.

Related

NPM : Error: Cannot find module 'balanced-match'

I just updated the node and npm using nvm. When I start the node server I am getting this error. I tried with different solutions. This type of questions already existed in stack overflow but none of these worked for me. So I tried with these things but no use.
1.Removed node modules and install node modules with npm install.
2.Updated babel-cli version.
3.downgraded node and nvm.
4.npm i balanced-match.
5.npm i -g balanced-match.
6.npm i balanced-match --save.
I am adding my package.json
{
"name": "******",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "nodemon express-server.js --exec babel-node",
"build": "babel ./ -d dist",
"serve": "node dist/index.js"
},
"author": "",
"license": "ISC",
"dependencies": {
"babel": "^6.23.0",
"bluebird": "^3.5.1",
"cookie-parser": "^1.4.3",
"cors": "^2.8.4",
"ejs": "^2.6.1",
"express": "^4.16.3",
"express-es6-template-engine": "^2.0.3",
"express-session": "^1.15.6",
"handlebars": "^4.0.11",
"helmet": "^3.13.0",
"html": "^1.0.0",
"instamojo-nodejs": "0.0.5",
"jsonwebtoken": "^8.2.2",
"lodash": "^4.17.10",
"moment": "^2.22.2",
"mongoose": "^5.1.3",
"mongoose-unique-validator": "^2.0.1",
"multer": "^1.3.0",
"mysql": "^2.15.0",
"node-fetch": "^2.1.2",
"node-schedule": "^1.3.0",
"node-xlsx": "^0.12.1",
"nodemailer": "^4.6.8",
"passport": "^0.4.0",
"passport-google-oauth20": "^1.0.0",
"passport-local": "^1.0.0",
"request": "^2.88.0",
"request-ip": "^2.0.2",
"sanitize-html": "^1.18.2",
"utf8": "^3.0.0",
"validator": "^10.2.0",
"xlsx2json": "^1.0.0"
},
"devDependencies": {
"babel-cli": "^6.26.0",
"babel-preset-es2015": "^6.24.1",
"babel-preset-stage-2": "^6.24.1",
"nodemon": "^1.17.5"
}
}
In console it showing like this.
console error
I wasted 12 hours time to solve this problem only.
I solved this problem by installing the balanced-match with npm install balanced-match in root folder. I don't know why it is taking root folder node modules. In console error it is clearly given path but I have not aware of it. If anyone explain why it is taking root node modules that would be helpful to me.
I did not see any node packages as balanced-match. Hence, it is giving the error. You can also manually add package in package.json and run npm install.
If you ran this command: npm i balanced-match --save there would be an entry for it in your package.json file. Does your app require this module for production or is it a development tool? That will determine which flag you should pass to the install command. From the docs:
-P, --save-prod: Package will appear in your dependencies. This is the default unless -D or -O are present.
-D, --save-dev: Package will appear in your devDependencies.
-O, --save-optional: Package will appear in your optionalDependencies.
--no-save: Prevents saving to dependencies.
When using any of the above options to save dependencies to your
package.json, there are two additional, optional flags:
-E, --save-exact: Saved dependencies will be configured with an exact version rather than using npm’s default semver range operator.
-B, --save-bundle: Saved dependencies will also be added to your bundleDependencies list.
The previous answer does have the most likely fix for your problem. You can either run the install command again with the correct flag for your use case (which will install it and update your package.json), or you can add it manually and run npm install again.
When you install, are there any errors at all? If not, it should work. You can check for installed packages using npm ls (passing optional tags like '-g' will show you all globally installed modules, and you can modify the output by also passing a depth tag like such: --depth=0.

Npm is ignoring dependencies

I decided to move my project into different folder. I didn't copy the node-modules folder.
When I run npm install, it said nothing and installed nothing. Obviously it looked into devDependencies section instead of Dependencies that I used before.
How can I make npm install all from Dependencies?
My package.json:
{
"name": "zzz",
"version": "0.0.0",
"private": true,
"scripts": {
"start": "node ./bin/www"
},
"dependencies": {
"body-parser": "~1.18.2",
"cookie-parser": "~1.4.3",
"debug": "~2.6.9",
"ejs": "~2.5.7",
"express": "~4.15.5",
"express-session": "^1.15.6",
"grunt": "^1.0.1",
"grunt-contrib-less": "^1.4.1",
"grunt-exec": "^3.0.0",
"grunt-link-html": "^0.1.2",
"moment": "^2.20.1",
"mongoose": "^5.0.0-rc1",
"morgan": "~1.9.0",
"passport": "^0.4.0",
"passport-local": "^1.0.0",
"serve-favicon": "~2.4.5"
}
}
If I try to install package individually it creates and updates devDependencies section, not dependencies as expected.
Solution found. It turned out that NPM stops working as expected if you have spaces in the "name" in package.json. As soon as I removed them NPM started working. It was so confusing!
There is a typo in your json in the form of a blank space near "serve-favicon": "~2.4.5". Better use an IDE like VSCODE and an extension like beautify to avoid unnecessary errors.Also its asking for a dependency "grunt#~0.4.0" . So install it and do npm install.

Change location for custom NPM package

I got a list of node-modules, which is managed by NPM.
This is my package.json:
{
"name": "extension-acme",
"scripts": {
"archive": "webpack -p && composer archive --format=zip"
},
"devDependencies": {
"babel-core": "^6.23.1",
"babel-loader": "^6.1.0",
"babel-plugin-transform-runtime": "^6.1.2",
"babel-preset-env": "^1.1.8",
"babel-preset-es2015": "^6.22.0",
"babel-runtime": "^5.8.0",
"vue-hot-reload-api": "^1.2.0",
"vue-html-loader": "^1.0.0",
"vue-loader": "^8.2.0",
"webpack": "^1.12.9"
}
}
This works fine. But now I'd like to include this node module: https://github.com/craigh411/vue-star-rating
Now the sources of this module have to be stored in app/components/vue-star-rating.
Is it possible to change the location for this single package?
First way
You can't install package in specific folder like app/components/vue-star-rating without node_modules folder.
You can install package like this:
npm --prefix app/components/ install <your-package>
and then installed in app/components/node_modules/<your-package>
reference:
Stackoverflow
npm folders
Second way
Also you can install package normally and move in specific folder

node npm install to central location

I was wondering if it is possible to do a single installation of node packages that can then be accessed by different development applications. For example, whenever I'm working on a react app, I do npm install to get all node packages the app needs. However, it seems that this gets a lot of unneeded extras. Is there a way
to just get what my app needs as specified in the package file or
get everything into the node modules folder in the installation folder and access the packages from there without having to reinstall them locally in every app folder.
I'm adding the following since my question is not being answered:
Let's say I have the following package.json. If I navigate to my app folder where this package.json file is located and I do npm install, what gets installed and where? My assumption is that only the packages listed in devDependencies and in dependencies will be installed and that it will be installed locally since I did not specify global. So why do I see hundreds of other packages (packages not in the list below) when I go into my node_modules folder in my app?
what I would like is to install only the packages listed below and to make them global so that if I go into another app directory I do not have to reinstall these.
{
"devDependencies": {
"babel-eslint": "7.1.1",
"babel-jest": "18.0.0",
"concurrently": "3.1.0",
"enzyme": "2.7.1",
"eslint": "3.12.1",
"eslint-config-defaults": "9.0.0",
"eslint-plugin-react": "6.7.1",
"jest": "18.1.0",
"json-server": "0.9.4",
"react-addons-test-utils": "15.4.2",
"react-test-renderer": "15.4.2",
"rimraf": "2.5.4",
"sass-lint": "1.10.2",
"tslint": "4.3.1",
"webpack-dev-server": "2.6.1"
},
"dependencies": {
"bootstrap": "4.0.0-alpha.6",
"bootstrap-loader": "2.0.0-beta.20",
"copy-webpack-plugin": "4.0.1",
"css-loader": "0.26.1",
"empty": "0.10.1",
"extract-text-webpack-plugin": "2.0.0-rc.3",
"file-loader": "0.10.0",
"html-loader": "0.4.3",
"html-webpack-plugin": "2.26.0",
"key-mirror": "1.0.1",
"lodash": "4.16.2",
"node-sass": "4.5.0",
"null-loader": "0.1.1",
"postcss": "5.2.9",
"postcss-import": "9.1.0",
"postcss-loader": "1.2.1",
"raw-loader": "0.5.1",
"react": "15.4.2",
"react-addons-css-transition-group": "15.4.2",
"react-dom": "15.4.2",
"react-redux": "5.0.2",
"react-router": "3.0.0",
"react-router-redux": "4.0.7",
"redux": "3.6.0",
"redux-thunk": "2.1.0",
"resolve-url-loader": "1.6.1",
"sass-loader": "5.0.1",
"style-loader": "0.13.1",
"ts-loader": "1.3.3",
"typescript": "2.1.4",
"url-loader": "0.5.7",
"webpack": "2.2.1",
"whatwg-fetch": "2.0.3"
},
}
This is exactly what global packages are for. npm i -g <package> also i recommend using nvm to manage your different node versions. This way you can have different global packages depending on version. You can even set aliases for multiple installs.
You can globally install nodeJs and then do npm install for the packages you need and save it in package.json. This way you would know which packages to install next time and just do npm install.

NPM is installing lots of libraries

When I use npm install base from package.json file it installs 337 libraries :/
Here is my package file
{
"name": "system_glowna",
"version": "2.0.0",
"dependencies": {
"angular2": "^2.0.0-beta.0",
"bootstrap": "^3.3.6",
"es6-promise": "^3.0.2",
"es6-shim": "^0.33.3",
"reflect-metadata": "0.1.2",
"rxjs": "5.0.0-beta.0",
"systemjs": "0.19.6",
"zone.js": "0.5.10"
},
"devDependencies": {
"del": "^1.2.0",
"gulp": "^3.8.11",
"gulp-autoprefixer": "^2.2.0",
"gulp-concat": "^2.5.2",
"gulp-inject": "^1.2.0",
"gulp-less": "^3.0.3",
"gulp-load-plugins": "^0.10.0",
"gulp-minify-css": "^1.1.6",
"gulp-minify-html": "^1.0.3",
"gulp-rename": "^1.2.2",
"gulp-replace": "^0.5.3",
"gulp-uglify": "^1.2.0",
"gulp-watch": "^4.2.4",
"run-sequence": "^1.1.0"
}
}
Why it's installing so many libraries? How to limit them?
npm prior to version 3.x installs libraries in a tree structure, so each library has its own node_modules and so on. It could lead (or almost always leads) to duplicated libraries inside different node_modules packages and results in a pretty big node_modules folder. Things get tricky e.g. on Windows, when paths could be too long to delete node_modules easily after.
However, after 3.x release of npm, it uses flat folder structure by default and only if there is any conflict, it installs proper versions for each library.
Note to yourself - the fact that npm installs so many libraries is necessary in order for each library to work properly :)
You've told it to install a fairly large number of libraries. Each of those libraries has its own dependencies, which are necessary for that library to run. You can't limit or prevent that unless you just don't want to use the library in question.
Note that installing lots of libraries isn't, by itself, a problem.

Resources