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

chore(*): use Yarn for dependency management #15435

Merged
merged 15 commits into from
Nov 29, 2016

Conversation

petebacondarwin
Copy link
Contributor

What kind of change does this PR introduce? (Bug fix, feature, docs update, ...)

What is the current behavior? (You can also link to an open issue here)

What is the new behavior (if this is a feature change)?

Does this PR introduce a breaking change?

Please check if the PR fulfills these requirements

Other information:

@Narretz
Copy link
Contributor

Narretz commented Nov 25, 2016

Node 6, here we come!
Can we have an explicite mention of the upgrade to node 6 in one of the commit messages? Is it implied by the change to yarn?

Copy link
Member

@gkalpak gkalpak left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎉 BTW, we also need to update docs/content/misc/contribute.ngdoc.

@@ -6,19 +6,19 @@ export BROWSER_STACK_ACCESS_KEY=`echo $BROWSER_STACK_ACCESS_KEY | rev`
export SAUCE_ACCESS_KEY=`echo $SAUCE_ACCESS_KEY | rev`

if [ "$JOB" == "ci-checks" ]; then
grunt ci-checks
node_modules/.bin/grunt ci-checks
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bad indentation (here and below).

@@ -16,7 +16,7 @@ var util = require('util');

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this file used any more (with init-repo.sh gone)? We could as well get rid of it altogether.

@@ -22,10 +22,10 @@ var ISO_DATE_REGEXP = /^\d{4,}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+(?:[+-
// 8. Query
// 9. Fragment
// 1111111111111111 222 333333 44444 555555555555555555555555 666 77777777 8888888 999
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: The last 5 should be a space.

# Use version of node.js found in .nvmrc
nvm install

npm install -g yarn
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: This file now does more than its name suggests. Maybe rename it to something like setup-node-env?

@petebacondarwin
Copy link
Contributor Author

I'll add better commit messages. I am pretty sure that yarn requires node 6+.

@@ -322,13 +318,6 @@ module.exports = function(grunt) {
}
});

// global beforeEach task
if (!process.env.TRAVIS) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't we run yarn here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, that sounds right.

@@ -1,208 +0,0 @@
#!/usr/bin/env node

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this removal have anything to do with switching to Yarn? Looks like a general cleanup.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, you're right, I will move it into separate commits

@@ -10,11 +10,11 @@
*
* @installation
*
* Currently, the **Component Router** module must be installed via `npm`, it is not yet available
* Currently, the **Component Router** module must be installed via `npm`/`yarn`, it is not yet available
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unrelated, but this "yet" is a little reaching... :) I'd remove the word.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll do so in a separate commit :-)

@@ -9,8 +9,8 @@
"url": "https://github.com/angular/angular.js.git"
},
"engines": {
"node": "<5",
"npm": "~2.5"
"node": "^6.9.0",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe ^6.9.1? 6.9.1 was released a day after 6.9.0 and contained critical fixes.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK

Copy link
Member

@gkalpak gkalpak left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added a few more nits 😃

@@ -467,13 +467,12 @@ to display list and detail views of Heroes and Crises.

## Install the libraries

It is easier to use npm to install the **Component Router** module. For this guide we will also install
AngularJS itself via npm:
It is easier to use [yarn](https://yarnpkg.com) to install the **Component Router** module.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Given yarn is still new, I would mention npm here too:

It is easier to use npm/yarn to install...

@@ -62,7 +69,7 @@ cd angular.js
git remote add upstream "https://github.com/angular/angular.js.git"

# Install node.js dependencies:
npm install
yarn

# Install bower components:
bower install
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not directly related to this PR:
This implies a global bower installation as well. This step isn't necessary though, since grunt package takes care of it (without requiring a global bower installation).

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

removed.

@@ -62,7 +69,7 @@ cd angular.js
git remote add upstream "https://github.com/angular/angular.js.git"

# Install node.js dependencies:
npm install
yarn
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe yarn install for "declarativeness".

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, the Yarn docs generally recommend just yarn but OK.

@@ -3,14 +3,13 @@
set -e

BASE_DIR=`dirname $0`
cd $BASE_DIR
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OOC, why this change?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This reminded me that scripts like this one are dangerous unless you add set -u at the beginning. Otherwise if suddenly a variable like that gets unset and later used, you may get unexpected results.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gkalpak the reason for the change is that yarn currently does not support being run from a subfolder. It must be run from where the package.json is held. See yarnpkg/yarn#2053

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@mgol - so this is the background, right? http://www.davidpashley.com/articles/writing-robust-shell-scripts/
In this case we are using the variable directly after defining it and the file is very small, so there is little chance of not being set.
Are you concerned that this variable will leak outside of the script and be relied upon elsewhere? Is that even possible without exporting the variable?

# Use version of node.js found in .nvmrc
nvm install

npm install -g yarn
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No comment for this little fellow? 😞

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should install a version matching what we have in package.json's engines.yarn field.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

jq is a good tool for that. You can play with it at https://jqplay.org/

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does the engines field actually have any effect?
I would have thought that calling yarn install with an invalid yarn version should cause some kind of warning or error from yarn or node or something. Otherwise, what is the point?
Although we could use engines to tell us what to install on jenkins, what about us humans who don't update their global yarn installations then the engines value changes?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some environments, like Heroku, use engines to decide what version to use. I guess it won't happen in our situation but we should still specify the version somewhere and it doesn't hurt to do it in engines and read from there; if someone wanted to do sth on one of these engines-reading tools, they could use these settings.

As for humans, we could always add a check for an installed version and require it to be not older than whatever's in engines.yarn.

grunt tests:docs --browsers="$BROWSERS" --reporters=dots
node_modules/.bin/grunt test:promises-aplus
node_modules/.bin/grunt test:unit --browsers="$BROWSERS" --reporters=dots
node_modules/.bin/grunt tests:docs --browsers="$BROWSERS" --reporters=dots
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bad indentation (here and below) 😟

@@ -21,11 +21,11 @@ var ISO_DATE_REGEXP = /^\d{4,}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+(?:[+-
// 7. Path
// 8. Query
// 9. Fragment
// 1111111111111111 222 333333 44444 555555555555555555555555 666 77777777 8888888 999
var URL_REGEXP = /^[a-z][a-z\d.+-]*:\/*(?:[^:@]+(?::[^@]+)?@)?(?:[^\s:/?#]+|\[[a-f\d:]+\])(?::\d+)?(?:\/[^?#]*)?(?:\?[^#]*)?(?:#.*)?$/i;
// 1111111111111111 222 333333 44444 55555555555555555555555 666 77777777 8888888 999
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

❤️

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The lack of named capture groups in JavaScript regular expressions is really annoying :P

@@ -322,13 +318,6 @@ module.exports = function(grunt) {
}
});

// global beforeEach task
if (!process.env.TRAVIS) {
grunt.task.run('shell:npm-install');
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FWIW, I think this was kind of useful...
(I can leave without it though.)

@@ -38,8 +38,7 @@ function build {
source ./init-node.sh
cd ../..

yarn
node_modules/.bin/grunt ci-checks package --no-color
grunt ci-checks package --no-color
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Two spaces between 'grunt' and 'ci' 😱

@@ -21,22 +21,21 @@ rm -f angular.js.size


# BUILD #
yarn
node_modules/.bin/grunt ci-checks package --no-color
grunt ci-checks package --no-color
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is grunt available globally?

'npm-install': {
command: 'node scripts/npm/check-node-modules.js'
'install-node-dependencies': {
command: 'yarn'
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Won't this take more time that simply comparing two files (s was happening before). I am not very keen on sacrificing speed for every task for this 😕

Copy link
Member

@mgol mgol Nov 28, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It shouldn't be a problem. The following was run on the angular.js repo with npm & yarn caches cleared:

$ time yarn --ignore-scripts
yarn --ignore-scripts  28.22s user 21.07s system 125% cpu 39.178 total
$ time yarn --ignore-scripts
yarn --ignore-scripts  6.49s user 2.68s system 120% cpu 7.583 total
$ time yarn --ignore-scripts
yarn --ignore-scripts  0.87s user 0.07s system 70% cpu 1.321 total
$ time yarn --ignore-scripts
yarn --ignore-scripts  0.86s user 0.07s system 70% cpu 1.313 total

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right 👍

When trying this myself, I stopped after the 2nd time 😃

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you try? It'd be good to make sure it's that quick not only on *NIX-es.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I did try of course. I didn't take your word for it 😛
It "stabilizes" at 2secs on my machine, which is OK (for me at least).

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder why it's not that fast on the second try, though. I'd expect it to behave identically in all situations where cache is populated and dependencies are correct so something looks wrong here.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's see: yarnpkg/yarn#2054

node_modules/.bin/grunt tests:docs --browsers="$BROWSERS" --reporters=dots
grunt test:promises-aplus
grunt test:unit --browsers="$BROWSERS" --reporters=dots
grunt tests:docs --browsers="$BROWSERS" --reporters=dots
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bad indentation 😛

# Use version of node.js found in .nvmrc
nvm install

npm install -g yarn
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should install a version matching what we have in package.json's engines.yarn field.

Copy link
Member

@gkalpak gkalpak left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A couple of minor comments/questions.
LGTM

@@ -1,2 +1 @@
4

6.9.1
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Isn't that too restrictive?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

6.9 is the LTS version of node. There are actually only two versions node of 6.9: 6.9.0 and 6.9.1 The former has issues that need to be fixed in 6.9.1. I don't see any reason why we should let people use versions below 6.9.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Moreover nvm is not capable of parsing ^6.9.1 so we would be stuck with 6.9 or worse 6, which could allow versions that we don't want such as 6.8.x and 6.9.0.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But it means that we always need to have (and switch to) 6.9.1 locally, even when 6.9.2+ comes out 😞

@@ -322,13 +333,10 @@ module.exports = function(grunt) {
}
});

// global beforeEach task
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You could leave this.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, although I found it slightly confusing due to its similarity to testing terminology - like it was something special. How about I modify it to something more humane?

development web server, run tests, and generate distributable files. Depending on your system,
you can install Node either from source or as a pre-packaged bundle.

We recommend using [nvm](https://github.com/creationix/nvm) to manage and install Node.js,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've been using https://github.com/coreybutler/nvm-windows for some time now and it works fine. I think it is worth mentioning it too.

We recommend using [nvm](https://github.com/creationix/nvm) to manage and install Node.js,
which makes it easy to change the version of Node.js per project.

* [Yarn](https://yarnpkg.com): We use Yarn to install our Node.js module dependencies (rather than using npm).
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It might be worth mentioning the installation command (npm install -g yarn).

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gkalpak - It's better to link to https://yarnpkg.com/en/docs/install. Installing Yarn via npm is not the recommended installation method and should only be used in cases where a proper package is not available for your environment.

@@ -9,16 +9,13 @@
"url": "https://github.com/angular/angular.js.git"
},
"engines": {
"node": "<5",
"npm": "~2.5"
"node": "6.9.1",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why restrict this to 6.9.1?

grunt tests:docs --browsers="$BROWSERS" --reporters=dots
grunt test:promises-aplus
grunt test:unit --browsers="$BROWSERS" --reporters=dots
grunt tests:docs --browsers="$BROWSERS" --reporters=dots
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bad indentation (this one never gets old 😛 )

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just keeping you interested :-P

@gkalpak
Copy link
Member

gkalpak commented Nov 28, 2016

BTW, I have tested this on Windows (10) and Ubuntu (16.04) with yarn && grunt test and everything works fine.

@Daniel15
Copy link

Daniel15 commented Nov 28, 2016

Please avoid installing Yarn via npm if possible. This is not recommended. It's significantly slower than all other methods of installing Yarn, and often results in weird issues around Yarn's dependencies.

If running on Debian or Ubuntu, you should use Yarn's Debian repository. For Windows, use Chocolatey or the installer. Otherwise, use the installation script (curl -o- -L https://yarnpkg.com/install.sh | bash) or just extract the tarball manually. Both methods (Debian package repository and installation script) allow you to specify the exact version of Yarn to install.

@petebacondarwin
Copy link
Contributor Author

@Daniel15 - thanks for the feedback about installing Yarn. Do you have any input on how we could lock down the version of Yarn that we are using to install our dependencies?

@Daniel15
Copy link

Daniel15 commented Nov 28, 2016 via email

@@ -2,6 +2,8 @@

set -e

yarn global add grunt-cli
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's lock the version. ;-)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

locked!

@petebacondarwin
Copy link
Contributor Author

@Daniel15 - thanks. I think we are going to go with:

curl -o- -L https://raw.githubusercontent.com/yarnpkg/yarn/v0.17.9/scripts/install-latest.sh | bash -s -- --version 0.17.9

which ensures that the install script is also locked to the version being installed.

@Daniel15
Copy link

Daniel15 commented Nov 28, 2016

@petebacondarwin - The version of install-latest.sh in the 0.17.9 tag is missing some features, such as GPG verification and the --version flag. I don't think we cherry-picked any of the changes to the install script into the stable branch, as we expect everyone to use https://yarnpkg.com/install.sh rather than directly referencing the script on GitHub. Eventually the script will move out of the Yarn repo into the releases repo, where the Debian repo is also kept.

If you like, you could just have your own small script that downloads and extracts Yarn, based off the install-latest.sh script. Or, just grab https://yarnpkg.com/install.sh and check it into your repo.

@mgol
Copy link
Member

mgol commented Nov 28, 2016

@Daniel15 Pete & me have tried using the install script but it doesn't work... I've tried downloading it & evaluating on the fly:

$ curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version 0.17.9
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    94  100    94    0     0    205      0 --:--:-- --:--:-- --:--:--   206
100  6074  100  6074    0     0   7515      0 --:--:-- --:--:-- --:--:-- 43078
Installing Yarn!
bash: line 164: yarn: command not found

as well as downloading first & then using:

$ curl -O -L https://yarnpkg.com/install.sh
$ chmod +x install.sh
$ ./install.sh --version 0.17.9
Installing Yarn!
./install.sh: line 164: yarn: command not found

EDIT: I've tried it on ZSH which I use by default but it's the same when using Bash. This probably shouldn't matter as the script itself uses Bash.

@Daniel15
Copy link

@mgol - Looks like there's a bug in the script when ~/.yarn exists but there's no Yarn version installed in it. I just filed an issue for it: yarnpkg/yarn#2061

@@ -2,7 +2,7 @@

set -e

yarn global add grunt-cli
yarn global add grunt-cli@1.2.0
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AFAICT, this will use the latest 1.x release. Is that intended or should we use the --exact option?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is weird, npm in this case would install the provided version. Also, Yarn docs are contradicting each other in the very same page:

yarn add [email protected] installs a specific version of a package from the registry.

vs:

For example, yarn add [email protected] would accept version 1.9.1, but yarn add [email protected] --exact would only accept version 1.2.3.

@Daniel15 could you clarify which one is right?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good spot!
Perhaps we should use --tilde?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, it's CLI, we should lock everything as much as possible.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Trying this locally, it seems that it will install the specific version (i.e. --exact makes no difference).
Probably a docs issue.

grunt tests:docs --browsers="$BROWSERS" --reporters=dots
grunt test:promises-aplus
grunt test:unit --browsers="$BROWSERS" --reporters=dots
grunt tests:docs --browsers="$BROWSERS" --reporters=dots
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good indentation! 😛

Copy link
Member

@gkalpak gkalpak left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

// Node.js version checks
if (!semver.satisfies(process.version, pkg.engines.node)) {
reportOrFail('Invalid node version (' + process.version + '). ' +
'Please use a version that satisfies ' + pkg.engines.node);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: Missing trailing period 😁
Nit: I would make the message a little "softer". For example, the build will (hopefully) work fine with v7+; calling it an "invalid version" sounds "strong".

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You're too kind! If you feel strongly about it I will let you fix up the messaging in a future commit.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Along with the missing full stops

var currentYarnVersion = exec('yarn --version', {silent: true}).stdout.trim();
if (!semver.satisfies(currentYarnVersion, expectedYarnVersion)) {
reportOrFail('Invalid yarn version (' + currentYarnVersion + '). ' +
'Please use a version that satisfies ' + expectedYarnVersion);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: Missing trailing period.

} else {
if (!semver.satisfies(match[1], expectedGruntVersion)) {
reportOrFail('Invalid grunt-cli version (' + match[1] + '). ' +
'Please use a version that satisfies ' + expectedGruntVersion);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: Missing trailing period.

@petebacondarwin petebacondarwin merged commit b77defd into angular:master Nov 29, 2016
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants