Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Fix npm shrinkwrap #11110

Closed
wants to merge 10 commits into from
Closed

Conversation

IgorMinar
Copy link
Contributor

cc: @juliemr

…nkwrap.clean.json

Previously we would clean up npm-shrinkwarp.json file in order to achieve serialization
stability, which would then allow us to create human readable diffs that allow code reviews
of npm-shrinkwrap to be meaningful.

This cleanup process does have an impact on the functionality of npm which was only recently
discovered by Vojta, when we tried to update to new Karma version. See: socketio/engine.io-client#370

According to Julie, the root cause of these issues is npm/npm/angular#3581.

The workaround implemented in this commit is not to interfere with npm-shrinkwrap.json file, but instead
preserve the cleaned up version of its content in npm-shrinkwrap.clean.json which can then be used to
produce human readable diffs for code reviews of npm dependency updates.
@juliemr
Copy link
Member

juliemr commented Feb 20, 2015

Thanks!

It looks like the intermittent 'cb() never called' issue is coming up.

Issue with possible fixes - maybe updating to npm 2.xx would help? npm/npm#5920

@IgorMinar
Copy link
Contributor Author

yeah. I think we should start requiring npm 2.x for angular builds.

you said that the issue is coming up but I don't see it and CI is green. where is it coming up? on your local machine?

@juliemr
Copy link
Member

juliemr commented Feb 20, 2015

The error is on an allowed failure, browserstack-unit.

@IgorMinar
Copy link
Contributor Author

oh. I didn't bother to look in there. I thought it was a flake :)

@juliemr
Copy link
Member

juliemr commented Feb 20, 2015

I'm trying out updating to npm 2.x right now: #11111

@juliemr
Copy link
Member

juliemr commented Feb 20, 2015

For the record - the reason for this change is that npm shrinkwrap was behaving differently after the clean-shrinkwrap stripped out the resolved field, and this could cause it to grab a package from the wrong source. See npm/npm#3581 (comment).

@IgorMinar
Copy link
Contributor Author

ok. I fixed the dependency on node and npm versions so that we always use npm 2.5. let's see if that fixes the cb() issues.

one odd thing is that without me messing with logging levels, there is a lot of debugging messages in the logs. see: https://travis-ci.org/angular/angular.js/jobs/51477379

any idea why?

@IgorMinar
Copy link
Contributor Author

I doubt that I'll have time to figure that out tomorrow, so if anyone wants to take over this PR, please be my guest.

@juliemr
Copy link
Member

juliemr commented Feb 20, 2015

My guess - it looks like the npm-shrinkwrap file has a non-standard version of Karma:

    "karma": {
      "version": "0.12.31",
      "from": "../../../../var/folders/_9/p__8cpj15lx5t538ggg0v2_w003k9q/T/npm-79025-87a1c15f/git-cache-481c19d307ab/94bf1319de85db854e5782dc798cfe2fc0609fa6",
      "resolved": "git+https://github.com/vojtajina/karma#94bf1319de85db854e5782dc798cfe2fc0609fa6",

That probably has some extra logging enabled. Whereas the previous one just had karma@0.12.23.

This is because the version of karma in package.json is "vojtajina/karma#socketio_10", (EDIT: this was due to 2db0aab, which never actually changed the version we were using because of shrinkwrap). We probably want to change that back to 0.12.31 until we get a new release of karma or karma-canary out?

@petebacondarwin
Copy link
Contributor

FYI : d64bf98

@IgorMinar
Copy link
Contributor Author

but that's the version we've been using in the last month and the logging was not there, so I don't know why is it there now.

@IgorMinar
Copy link
Contributor Author

oh. I see. I accidentally updated karma from

-    "karma": {
-      "version": "0.12.23",

to

 "karma": {
      "version": "0.12.31",
      "from": "../../../../var/folders/_9/p__8cpj15lx5t538ggg0v2_w003k9q/T/npm-79025-87a1c15f/git-cache-481c19d307ab/94bf1319de85db854e5782dc798cfe2fc0609fa6",
      "resolved": "git+https://github.com/vojtajina/karma#94bf1319de85db854e5782dc798cfe2fc0609fa6",

I think someone (vojta?) modified the package.json but didn't update the shrinkwrap before, the change took effect only now.

I'll go back and change that to the latest karma.

@IgorMinar
Copy link
Contributor Author

ok. I believe I managed to untangle the mess and we should be all good.

If CI passes, we should merge this in and then hurry up and upgrade karma to use socket.io 1.x and then upgrade karma in angular again.

@IgorMinar
Copy link
Contributor Author

hmm... the ci still prints debug statements. anyone knows why?

INFO [launcher.sauce]: safari 8 (OS X 10.10) session at https://saucelabs.com/tests/b1fa76173cd94eb5afd1514de8c1644f
INFO [Chrome 39.0.2171 (Linux)]: got results 50
..................................................INFO [Firefox 31.0.0 (Linux)]: got results 50
..............................

notice the "got results 50" string

source: https://travis-ci.org/angular/angular.js/jobs/51548811

@IgorMinar
Copy link
Contributor Author

I can't repro this locally even when I use the dots reporter like travis.

I wonder if the travis cache is serving up the old node_modules version and npm is silly enough to not upgrade the node_modules now that node_modules directory doesn't match the requirements in npm-shrinkwrap.json.

I'll try to blow away the node_modules cache and see if that helps

@IgorMinar
Copy link
Contributor Author

yes, as suspected. that was the problem! see: https://travis-ci.org/angular/angular.js/jobs/51550774

so npm install just blindly accepts the node_modules cache and doesn't verify if it matches requirements in the current npm-shrinkwrap.json.

@tbosch came up with a nice trick to work around this (though this must be fixed in npm). The trick is as to modify the .travis.yaml in the following way:

  • add node_modules/npm-shrinkwrap.ng-hack.json to the cache section
  • in the install section, when we start, check if node_modules/npm-shrinkwrap.ng-hack.json is identical to npmshrinkwrap.json
    • if it is, continue
    • if there is a difference delete node_modules directory
  • run npm install
  • copy npm-shrinkwrap.json to node_modules/npm-shrinkwrap.ng-hack.json

This way we retain the benefits of the cache but also our sanity when shrinkwrap changes.

It would be even better to make this part of the grunt init so that we do the same in non-ci environment.

@IgorMinar IgorMinar mentioned this pull request Feb 20, 2015
2 tasks
@IgorMinar
Copy link
Contributor Author

@mzgol I'll try that. thanks!

IgorMinar added a commit to IgorMinar/angular.js that referenced this pull request Feb 21, 2015
… changes

`npm install` blindly accepts the node_modules cache and doesn't verify if it matches requirements in the current npm-shrinkwrap.json.

This means that if we are using travis cache and npm-shrinkwrap.json changes npm will keep on using the old dependencies, in spite of the guarantees that shrinkwrap claims to offer.

angular#11110 (comment)
IgorMinar added a commit to IgorMinar/angular.js that referenced this pull request Feb 21, 2015
… changes

`npm install` blindly accepts the node_modules cache and doesn't verify if it matches requirements in the current npm-shrinkwrap.json.

This means that if we are using travis cache and npm-shrinkwrap.json changes npm will keep on using the old dependencies, in spite of the guarantees that shrinkwrap claims to offer.

angular#11110 (comment)
@IgorMinar
Copy link
Contributor Author

@mzgol if I switch to node 0.12, karma 0.12.31 fails to install fsevents on mac:

npm WARN engine karma@0.12.31: wanted: {"node":"~0.8 || ~0.10"} (current: {"node":"0.12.0","npm":"2.5.1"})

> fsevents@0.3.5 install /Users/iminar/Dev/angular.js/node_modules/karma/node_modules/chokidar/node_modules/fsevents
> node-gyp rebuild

child_process: customFds option is deprecated, use stdio instead.
  SOLINK_MODULE(target) Release/.node
  SOLINK_MODULE(target) Release/.node: Finished
  CXX(target) Release/obj.target/fse/fsevents.o
  SOLINK_MODULE(target) Release/fse.node
  SOLINK_MODULE(target) Release/fse.node: Finished

> ws@0.4.32 install /Users/iminar/Dev/angular.js/node_modules/karma/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws
> (node-gyp rebuild 2> builderror.log) || (exit 0)

  CXX(target) Release/obj.target/bufferutil/src/bufferutil.o
  SOLINK_MODULE(target) Release/bufferutil.node
  SOLINK_MODULE(target) Release/bufferutil.node: Finished
  CXX(target) Release/obj.target/validation/src/validation.o
  SOLINK_MODULE(target) Release/validation.node
  SOLINK_MODULE(target) Release/validation.node: Finished
npm WARN engine hawk@0.10.2: wanted: {"node":"0.8.x"} (current: {"node":"0.12.0","npm":"2.5.1"})
npm WARN engine xmlbuilder@2.4.6: wanted: {"node":"0.8.x || 0.10.x || 0.11.x  || 1.0.x"} (current: {"node":"0.12.0","npm":"2.5.1"})
npm WARN engine cryptiles@0.1.3: wanted: {"node":"0.8.x"} (current: {"node":"0.12.0","npm":"2.5.1"})
npm WARN engine sntp@0.1.4: wanted: {"node":"0.8.x"} (current: {"node":"0.12.0","npm":"2.5.1"})
npm WARN engine hoek@0.7.6: wanted: {"node":"0.8.x"} (current: {"node":"0.12.0","npm":"2.5.1"})
npm WARN engine boom@0.3.8: wanted: {"node":"0.8.x"} (current: {"node":"0.12.0","npm":"2.5.1"})
npm WARN engine bootstrap@3.3.2: wanted: {"node":"~0.10.1"} (current: {"node":"0.12.0","npm":"2.5.1"})

> fsevents@0.2.1 install /Users/iminar/Dev/angular.js/node_modules/dgeni-packages/node_modules/nunjucks/node_modules/chokidar/node_modules/fsevents
> node-gyp rebuild

child_process: customFds option is deprecated, use stdio instead.
  CXX(target) Release/obj.target/fse/fsevents.o
In file included from ../fsevents.cc:6:
../node_modules/nan/nan.h:339:13: error: no member named 'New' in 'v8::String'
    return  _NAN_ERROR(v8::Exception::Error, errmsg);
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../node_modules/nan/nan.h:319:50: note: expanded from macro '_NAN_ERROR'
# define _NAN_ERROR(fun, errmsg) fun(v8::String::New(errmsg))
                                     ~~~~~~~~~~~~^
../node_modules/nan/nan.h:343:5: error: no member named 'ThrowException' in namespace 'v8'
    _NAN_THROW_ERROR(v8::Exception::Error, errmsg);
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../node_modules/nan/nan.h:324:11: note: expanded from macro '_NAN_THROW_ERROR'
      v8::ThrowException(_NAN_ERROR(fun, errmsg));                             \
      ~~~~^
../node_modules/nan/nan.h:343:5: error: no member named 'New' in 'v8::String'
    _NAN_THROW_ERROR(v8::Exception::Error, errmsg);
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../node_modules/nan/nan.h:324:26: note: expanded from macro '_NAN_THROW_ERROR'
      v8::ThrowException(_NAN_ERROR(fun, errmsg));                             \
                         ^~~~~~~~~~~~~~~~~~~~~~~
../node_modules/nan/nan.h:319:50: note: expanded from macro '_NAN_ERROR'
# define _NAN_ERROR(fun, errmsg) fun(v8::String::New(errmsg))
                                     ~~~~~~~~~~~~^
../node_modules/nan/nan.h:348:9: error: no type named 'ThrowException' in namespace 'v8'
    v8::ThrowException(error);
    ~~~~^
../node_modules/nan/nan.h:355:65: error: no member named 'New' in 'v8::String'
    v8::Local<v8::Value> err = v8::Exception::Error(v8::String::New(msg));
                                                    ~~~~~~~~~~~~^
../node_modules/nan/nan.h:357:26: error: no member named 'New' in 'v8::String'
    obj->Set(v8::String::New("code"), v8::Int32::New(errorNumber));
             ~~~~~~~~~~~~^
../node_modules/nan/nan.h:369:12: error: no member named 'New' in 'v8::String'
    return _NAN_ERROR(v8::Exception::TypeError, errmsg);
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../node_modules/nan/nan.h:319:50: note: expanded from macro '_NAN_ERROR'
# define _NAN_ERROR(fun, errmsg) fun(v8::String::New(errmsg))
                                     ~~~~~~~~~~~~^
../node_modules/nan/nan.h:373:5: error: no member named 'ThrowException' in namespace 'v8'
    _NAN_THROW_ERROR(v8::Exception::TypeError, errmsg);
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../node_modules/nan/nan.h:324:11: note: expanded from macro '_NAN_THROW_ERROR'
      v8::ThrowException(_NAN_ERROR(fun, errmsg));                             \
      ~~~~^
../node_modules/nan/nan.h:373:5: error: no member named 'New' in 'v8::String'
    _NAN_THROW_ERROR(v8::Exception::TypeError, errmsg);
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../node_modules/nan/nan.h:324:26: note: expanded from macro '_NAN_THROW_ERROR'
      v8::ThrowException(_NAN_ERROR(fun, errmsg));                             \
                         ^~~~~~~~~~~~~~~~~~~~~~~
../node_modules/nan/nan.h:319:50: note: expanded from macro '_NAN_ERROR'
# define _NAN_ERROR(fun, errmsg) fun(v8::String::New(errmsg))
                                     ~~~~~~~~~~~~^
../node_modules/nan/nan.h:377:12: error: no member named 'New' in 'v8::String'
    return _NAN_ERROR(v8::Exception::RangeError, errmsg);
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../node_modules/nan/nan.h:319:50: note: expanded from macro '_NAN_ERROR'
# define _NAN_ERROR(fun, errmsg) fun(v8::String::New(errmsg))
                                     ~~~~~~~~~~~~^
../node_modules/nan/nan.h:381:5: error: no member named 'ThrowException' in namespace 'v8'
    _NAN_THROW_ERROR(v8::Exception::RangeError, errmsg);
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../node_modules/nan/nan.h:324:11: note: expanded from macro '_NAN_THROW_ERROR'
      v8::ThrowException(_NAN_ERROR(fun, errmsg));                             \
      ~~~~^
../node_modules/nan/nan.h:381:5: error: no member named 'New' in 'v8::String'
    _NAN_THROW_ERROR(v8::Exception::RangeError, errmsg);
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../node_modules/nan/nan.h:324:26: note: expanded from macro '_NAN_THROW_ERROR'
      v8::ThrowException(_NAN_ERROR(fun, errmsg));                             \
                         ^~~~~~~~~~~~~~~~~~~~~~~
../node_modules/nan/nan.h:319:50: note: expanded from macro '_NAN_ERROR'
# define _NAN_ERROR(fun, errmsg) fun(v8::String::New(errmsg))
                                     ~~~~~~~~~~~~^
../node_modules/nan/nan.h:727:49: error: too few arguments to function call, single argument 'isolate' was not specified
    v8::Local<v8::Object> obj = v8::Object::New();
                                ~~~~~~~~~~~~~~~ ^
/Users/iminar/.node-gyp/0.12.0/deps/v8/include/v8.h:2388:3: note: 'New' declared here
  static Local<Object> New(Isolate* isolate);
  ^
In file included from ../fsevents.cc:6:
../node_modules/nan/nan.h:733:49: error: too few arguments to function call, single argument 'isolate' was not specified
    v8::Local<v8::Object> obj = v8::Object::New();
                                ~~~~~~~~~~~~~~~ ^
/Users/iminar/.node-gyp/0.12.0/deps/v8/include/v8.h:2388:3: note: 'New' declared here
  static Local<Object> New(Isolate* isolate);
  ^
In file included from ../fsevents.cc:6:
../node_modules/nan/nan.h:740:12: error: no member named 'Dispose' in 'v8::Persistent<v8::Object,
      v8::NonCopyablePersistentTraits<v8::Object> >'
    handle.Dispose();
    ~~~~~~ ^
../node_modules/nan/nan.h:741:12: error: no member named 'Clear' in 'v8::Persistent<v8::Object,
      v8::NonCopyablePersistentTraits<v8::Object> >'
    handle.Clear();
    ~~~~~~ ^
../node_modules/nan/nan.h:746:39: error: no member named 'NewSymbol' in 'v8::String'; did you mean 'IsSymbol'?
    NanPersistentToLocal(handle)->Set(NanSymbol("callback"), fn);
                                      ^~~~~~~~~~~~~~~~~~~~~
../node_modules/nan/nan.h:181:38: note: expanded from macro 'NanSymbol'
#define NanSymbol(value) v8::String::NewSymbol(value)
                         ~~~~~~~~~~~~^
/Users/iminar/.node-gyp/0.12.0/deps/v8/include/v8.h:1379:8: note: 'IsSymbol' declared here
  bool IsSymbol() const;
       ^
In file included from ../fsevents.cc:6:
../node_modules/nan/nan.h:746:39: error: call to non-static member function without an object argument
    NanPersistentToLocal(handle)->Set(NanSymbol("callback"), fn);
                                      ^~~~~~~~~~~~~~~~~~~~~
../node_modules/nan/nan.h:181:38: note: expanded from macro 'NanSymbol'
#define NanSymbol(value) v8::String::NewSymbol(value)
                         ~~~~~~~~~~~~^~~~~~~~~
../node_modules/nan/nan.h:750:46: error: no member named 'NewSymbol' in 'v8::String'; did you mean 'IsSymbol'?
    return NanPersistentToLocal(handle)->Get(NanSymbol("callback"))
                                             ^~~~~~~~~~~~~~~~~~~~~
../node_modules/nan/nan.h:181:38: note: expanded from macro 'NanSymbol'
#define NanSymbol(value) v8::String::NewSymbol(value)
                         ~~~~~~~~~~~~^
/Users/iminar/.node-gyp/0.12.0/deps/v8/include/v8.h:1379:8: note: 'IsSymbol' declared here
  bool IsSymbol() const;
       ^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
make: *** [Release/obj.target/fse/fsevents.o] Error 1
gyp ERR! build error 
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack     at ChildProcess.onExit (/Users/iminar/.nvm/versions/node/v0.12.0/lib/node_modules/npm/node_modules/node-gyp/lib/build.js:267:23)
gyp ERR! stack     at ChildProcess.emit (events.js:110:17)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (child_process.js:1067:12)
gyp ERR! System Darwin 13.4.0
gyp ERR! command "node" "/Users/iminar/.nvm/versions/node/v0.12.0/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
gyp ERR! cwd /Users/iminar/Dev/angular.js/node_modules/dgeni-packages/node_modules/nunjucks/node_modules/chokidar/node_modules/fsevents
gyp ERR! node -v v0.12.0
gyp ERR! node-gyp -v v1.0.2
gyp ERR! not ok 
npm WARN optional dep failed, continuing fsevents@0.2.1

IgorMinar added a commit to IgorMinar/angular.js that referenced this pull request Feb 21, 2015
… changes

`npm install` blindly accepts the node_modules cache and doesn't verify if it matches requirements in the current npm-shrinkwrap.json.

This means that if we are using travis cache and npm-shrinkwrap.json changes npm will keep on using the old dependencies, in spite of the guarantees that shrinkwrap claims to offer.

angular#11110 (comment)

With this change, we will blow away the node_modules directory if the shrinkwrap changes compared to the one
used to populate node_modules.
@IgorMinar
Copy link
Contributor Author

Alright, I believe that this PR is good to be merged now.

The CI is green https://travis-ci.org/angular/angular.js/builds/51605768 and all known issues are resolved except for upgrade to node 0.12, which is out of scope.

Can someone take one more last look please?

@juliemr
Copy link
Member

juliemr commented Feb 21, 2015 via email

@mgol
Copy link
Member

mgol commented Feb 21, 2015

@IgorMinar The failures are from dgeni-packages, not Karma (they're still soft failures only btw, it's usable). The reason is the same - dgeni-packages should get fsevents updated to the latest version that plays nice with Node 0.12.

EDIT: Actually, dgeni-packages should update nunjucks. The dependency path is as follows:

dgeni-packages -> nunjucks -> chokidar -> fsevents

The latest nunjucks installs correctly on Node 0.12.

@mgol
Copy link
Member

mgol commented Feb 21, 2015

@IgorMinar I reported angular/dgeni-packages#108 for the dgeni-packages Node 0.12 issue.

currently karma's dependencies don't install on node 0.12 or io.js so we'll just update npm in hope that that
this will mitigate "cb() never called!" erorrs. See: https://travis-ci.org/angular/angular.js/jobs/51474043#L2181
previously we thought that git:// was enough, but we also want git+https:// otherwise we can miss important info
in clean shrinkwrap file
it usually contains urls to temp directories which are not interesting, the info
we do want to preserve is in the `resolved` property and we do keep that one.
Previously Vojta set us up to use a custom fork of Karma that used socket.io 1.3.4. This change moves us to an official release of Karma but downgrades socket.io back to 0.9.16.

We now need to hurry up and finish the socket.io upgrade in karma which was blocked on shrinkwrap issues in Angular that are resolved with the previous few commits in this PR.
… changes

`npm install` blindly accepts the node_modules cache and doesn't verify if it matches requirements in the current npm-shrinkwrap.json.

This means that if we are using travis cache and npm-shrinkwrap.json changes npm will keep on using the old dependencies, in spite of the guarantees that shrinkwrap claims to offer.

angular#11110 (comment)

With this change, we will blow away the node_modules directory if the shrinkwrap changes compared to the one
used to populate node_modules.
`du` returns error code 2 when any of the directories don't exist which breaks the build.

this scenario is common when the cache was emptied or when travis is building forks that don't have travis cache enabled
…changes

this replicates the travis setup in grunt from the previous commit

the reason why we duplicate this rather than having just a single place for this code is so that
we can individually time the actions on travis
…into install-dependencies.sh

So now we are DRY.

Added extra error checking and improved the grunt file init setup so that stdio is visible in console.
@IgorMinar
Copy link
Contributor Author

aha! thanks @mzgol

I'll still postpone node update until the issue is fixed in dgeni. I don't want errors in logs even if they are harmless.

@IgorMinar
Copy link
Contributor Author

ok. I made a few more changes. the last two commits add the same safecheck to grunt, so that even in dev mode we are safe. and then I extracted the logic into a common script.

if CI passes I'm going to merge this into master

IgorMinar added a commit that referenced this pull request Feb 22, 2015
… changes

`npm install` blindly accepts the node_modules cache and doesn't verify if it matches requirements in the current npm-shrinkwrap.json.

This means that if we are using travis cache and npm-shrinkwrap.json changes npm will keep on using the old dependencies, in spite of the guarantees that shrinkwrap claims to offer.

#11110 (comment)

With this change, we will blow away the node_modules directory if the shrinkwrap changes compared to the one
used to populate node_modules.
@IgorMinar IgorMinar closed this in 0356d72 Feb 22, 2015
IgorMinar added a commit to IgorMinar/angular.js that referenced this pull request Feb 22, 2015
… changes

`npm install` blindly accepts the node_modules cache and doesn't verify if it matches requirements in the current npm-shrinkwrap.json.

This means that if we are using travis cache and npm-shrinkwrap.json changes npm will keep on using the old dependencies, in spite of the guarantees that shrinkwrap claims to offer.

angular#11110 (comment)

With this change, we will blow away the node_modules directory if the shrinkwrap changes compared to the one
used to populate node_modules.
IgorMinar added a commit to IgorMinar/angular.js that referenced this pull request Feb 22, 2015
…into install-dependencies.sh

So now we are DRY.

Added extra error checking and improved the grunt file init setup so that stdio is visible in console.

Closes angular#11110
netman92 pushed a commit to netman92/angular.js that referenced this pull request Aug 8, 2015
… changes

`npm install` blindly accepts the node_modules cache and doesn't verify if it matches requirements in the current npm-shrinkwrap.json.

This means that if we are using travis cache and npm-shrinkwrap.json changes npm will keep on using the old dependencies, in spite of the guarantees that shrinkwrap claims to offer.

angular#11110 (comment)

With this change, we will blow away the node_modules directory if the shrinkwrap changes compared to the one
used to populate node_modules.
netman92 pushed a commit to netman92/angular.js that referenced this pull request Aug 8, 2015
…into install-dependencies.sh

So now we are DRY.

Added extra error checking and improved the grunt file init setup so that stdio is visible in console.

Closes angular#11110
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants