angularnpmnode-modulespackage.jsonwebpack-production

How to fix serve error due to package.json missing in production only?


How can I fix the error below:

> ng "serve" "0.0.0.0" "--poll=2500" "--disable-host-check" "--prod=true"

WARNING Running a server with --disable-host-check is a security risk. See https://medium.com/webpack/webpack-dev-server-middleware-security-issues-1489d950874a for more information.
****************************************************************************************
This is a simple server for use in testing or debugging Angular applications locally.
It hasn't been reviewed for security issues.

DON'T USE IT FOR PRODUCTION!
****************************************************************************************
** NG Live Development Server is listening on localhost:4200, open your browser on http://localhost:4200/ **
 95% emittingUnhandled rejection Error: ENOENT: no such file or directory, open '/usr/src/web/node_modules/handsontable/package.json'
    at Object.openSync (fs.js:461:3)
    at Object.readFileSync (fs.js:364:35)
    at LicenseExtractor.readPackageJson (/usr/src/web/node_modules/license-webpack-plugin/dist/LicenseExtractor.js:126:23)
    at LicenseExtractor.parsePackage (/usr/src/web/node_modules/license-webpack-plugin/dist/LicenseExtractor.js:23:32)
    at ModuleProcessor.processPackage (/usr/src/web/node_modules/license-webpack-plugin/dist/ModuleProcessor.js:44:46)
    at ModuleProcessor.processFile (/usr/src/web/node_modules/license-webpack-plugin/dist/ModuleProcessor.js:41:21)
    at fileCallback (/usr/src/web/node_modules/license-webpack-plugin/dist/LicenseWebpackPlugin.js:107:61)
    at moduleCallback (/usr/src/web/node_modules/license-webpack-plugin/dist/LicenseWebpackPlugin.js:114:21)
    at /usr/src/web/node_modules/license-webpack-plugin/dist/LicenseWebpackPlugin.js:126:29
    at Array.forEach (<anonymous>)
    at Compiler.emitCallback (/usr/src/web/node_modules/license-webpack-plugin/dist/LicenseWebpackPlugin.js:92:32)
    at next (/usr/src/web/node_modules/tapable/lib/Tapable.js:204:14)
    at /usr/src/web/node_modules/html-webpack-plugin/index.js:204:9
    at PassThroughHandlerContext.finallyHandler (/usr/src/web/node_modules/bluebird/js/release/finally.js:56:23)
    at PassThroughHandlerContext.tryCatcher (/usr/src/web/node_modules/bluebird/js/release/util.js:16:23)
    at Promise._settlePromiseFromHandler (/usr/src/web/node_modules/bluebird/js/release/promise.js:547:31)

thrown when:

npm run ng serve --host 0.0.0.0 -- --poll=2500 --disable-host-check --prod=true

is run. But which isn't thrown when:

npm run ng serve --host 0.0.0.0 -- --poll=2500 --disable-host-check

is run?

Here's the package.json:

{
  "name": "retailportal-web",
  "version": "0.0.0",
  "license": "MIT",
  "angular-cli": {},
  "scripts": {
    "ng": "ng",
    "start": "ng serve --host 0.0.0.0",
    "test": "ng test",
    "build": "ng build --base-href /SopPortal/",
    "build-prod": "ng build --prod --base-href /SopPortal/",
    "pree2e": "webdriver-manager update --standalone false --gecko false",
    "e2e": "protractor"
  },
  "private": true,
  "dependencies": {
    "@angular/animations": "5.1.1",
    "@angular/cdk": "5.0.1",
    "@angular/common": "~5.1.1",
    "@angular/compiler": "~5.1.1",
    "@angular/core": "~5.1.1",
    "@angular/forms": "~5.1.1",
    "@angular/http": "~5.1.1",
    "@angular/material": "5.0.1",
    "@angular/material-moment-adapter": "5.0.3",
    "@angular/platform-browser": "~5.1.1",
    "@angular/platform-browser-dynamic": "~5.1.1",
    "@angular/router": "~5.1.1",
    "@ng-bootstrap/ng-bootstrap": "~1.0.0-beta.8",
    "@ng-select/ng-select": "~0.25.0",
    "@ngx-translate/core": "~9.0.2",
    "@ngx-translate/http-loader": "~2.0.0",
    "@types/jquery": "~3.2.17",
    "angular-highcharts": "5.2.8",
    "compass-sass-mixins": "0.12.7",
    "core-js": "~2.5.3",
    "enhanced-resolve": "3.3.0",
    "font-awesome": "4.7.0",
    "hammerjs": "~2.0.8",
    "highcharts": "6.0.6",
    "numbro": "2.1.2",
    "jquery": "~3.2.1",
    "ng-bootstrap": "~1.6.3",
    "ng2-file-upload": "~1.3.0",
    "ng2-handsontable": "2.0.0",
    "node-sass": "^4.7.2",
    "rxjs": "~5.5.5",
    "tether": "~1.4.3",
    "ts-helpers": "~1.1.2",
    "zone.js": "~0.8.18"
  },
  "devDependencies": {
    "@angular/cli": "1.7.1",
    "@angular/compiler-cli": "~5.0.0",
    "@types/highcharts": "5.0.16",
    "@types/jasmine": "2.5.45",
    "@types/jquery": "~3.2.12",
    "@types/node": "~6.0.60",
    "codelyzer": "~3.1.1",
    "jasmine-core": "2.6.2",
    "jasmine-spec-reporter": "4.1.0",
    "karma": "1.7.0",
    "karma-chrome-launcher": "~2.1.1",
    "karma-cli": "~1.0.1",
    "karma-jasmine": "~1.1.0",
    "karma-remap-istanbul": "~0.2.1",
    "moment": "~2.20.1",
    "protractor": "~5.1.2",
    "ts-md5": "~1.2.0",
    "ts-node": "3.0.4",
    "tslint": "~5.3.2",
    "typescript": "2.4.2"
  }
}

and npm ls --depth=0:

# npm ls --depth=0
retailportal-web@0.0.0 /usr/src/web
+-- @angular/animations@5.1.1
+-- @angular/cdk@5.0.1
+-- @angular/cli@1.7.1
+-- UNMET PEER DEPENDENCY @angular/common@5.1.3
+-- UNMET PEER DEPENDENCY @angular/compiler@5.1.3
+-- @angular/compiler-cli@5.0.5
+-- UNMET PEER DEPENDENCY @angular/core@5.1.3
+-- UNMET PEER DEPENDENCY @angular/forms@5.1.3
+-- @angular/http@5.1.3
+-- UNMET PEER DEPENDENCY @angular/material@5.0.1
+-- @angular/material-moment-adapter@5.0.3
+-- @angular/platform-browser@5.1.3
+-- @angular/platform-browser-dynamic@5.1.3
+-- @angular/router@5.1.3
+-- @ng-bootstrap/ng-bootstrap@1.0.4
+-- @ng-select/ng-select@0.25.0
+-- @ngx-translate/core@9.0.2
+-- @ngx-translate/http-loader@2.0.1
+-- @types/highcharts@5.0.16
+-- @types/jasmine@2.5.45
+-- @types/jquery@3.2.18
+-- @types/node@6.0.118
+-- angular-highcharts@5.2.8
+-- bindings@1.5.0 extraneous
+-- codelyzer@3.1.2
+-- compass-sass-mixins@0.12.7
+-- core-js@2.5.7
+-- enhanced-resolve@3.3.0
+-- font-awesome@4.7.0
+-- hammerjs@2.0.8
+--  extraneous error: ENOENT: no such file or directory, open '/usr/src/web/node_modules/handsontable/package.json
+-- highcharts@6.0.6
+-- jasmine-core@2.6.2
+-- jasmine-spec-reporter@4.1.0
+-- jquery@3.2.1
+-- karma@1.7.0
+-- karma-chrome-launcher@2.1.1
+-- karma-cli@1.0.1
+-- karma-jasmine@1.1.2
+-- karma-remap-istanbul@0.2.2
+-- moment@2.20.1
+-- ng-bootstrap@1.6.3
+-- ng2-file-upload@1.3.0
+-- ng2-handsontable@2.0.0
+-- node-sass@4.14.1
+-- numbro@2.1.2
+-- protractor@5.1.2
+-- rxjs@5.5.12
+-- tether@1.4.7
+-- ts-helpers@1.1.2
+-- ts-md5@1.2.7
+-- ts-node@3.0.4
+-- tslint@5.3.2
+-- typescript@2.4.2
`-- zone.js@0.8.29

npm ERR! peer dep missing: @angular/common@^4.0.0, required by ng2-handsontable@2.0.0
npm ERR! peer dep missing: @angular/compiler@5.0.5, required by @angular/compiler-cli@5.0.5
npm ERR! peer dep missing: @angular/compiler@^2.3.1 || >=4.0.0-beta <5.0.0, required by codelyzer@3.1.2
npm ERR! peer dep missing: @angular/compiler@^4.0.0, required by ng2-handsontable@2.0.0
npm ERR! peer dep missing: @angular/core@5.1.1, required by @angular/animations@5.1.1
npm ERR! peer dep missing: @angular/core@^2.3.1 || >=4.0.0-beta <5.0.0, required by codelyzer@3.1.2
npm ERR! peer dep missing: @angular/core@^4.0.0, required by ng2-handsontable@2.0.0
npm ERR! peer dep missing: @angular/forms@^4.0.0, required by ng2-handsontable@2.0.0
npm ERR! peer dep missing: @angular/material@5.0.3, required by @angular/material-moment-adapter@5.0.3
npm ERR! extraneous: handsontable /usr/src/web/node_modules/handsontable
npm ERR! error in /usr/src/web/node_modules/handsontable: ENOENT: no such file or directory, open '/usr/src/web/node_modules/handsontable/package.json'
npm ERR! extraneous: bindings@1.5.0 /usr/src/web/node_modules/bindings

node & npm versions:

# node --version
v14.2.0
# npm --version
6.14.4
# 

also tried with node 6 to no avail.

the package handsontable is supplied independent from npm.


Solution

  • When you build in prod mode, angular tries to extract licenses from the 3rd party libs that you use into a 3rdpartylicenses.txt file. For that, it needs looking at package.json files.

    Since you put your handontable package manually in your node_modules, it's missing package.json.

    What you should really do is install handontable with npm (specify the version if needed)

    npm add -S handsontable
    

    A workaround is to disable extracting the licenses, by passing a flag when building

    npm run ng serve --host 0.0.0.0 --poll=2500 --disable-host-check --prod=true --extractLicenses=false