[rrm] npm-publish command

This will publish all packages in build/packages/*.tgz to the "next" tag. If the current version is "stable" (doesn't trigger semver.prerelease()) then it will also update the "latest" dist-tag to point at that version.
This commit is contained in:
Paul O’Shannessy 2016-07-21 16:01:09 -07:00 committed by Dan Abramov
parent 0e9aa2e9a9
commit e3a41edd83
4 changed files with 83 additions and 0 deletions

View File

@ -31,6 +31,13 @@ Cherry-picks PRs that are set to the `15-next` milestone. Handles merge conflict
Bumps the version in all the places that need it. Bumps the version in all the places that need it.
### `npm-publish`
Publishes all built packages to npm (`next` dist-tag) and then for stable releases, also updates the `latest` dist-tag.
**Prereqs:**
- Have done everything else required for releasing (updating version, etc) and run `grunt build` or `grunt release`.
### `q` ### `q`
A secret alias to `exit` because `q` is faster. A secret alias to `exit` because `q` is faster.

View File

@ -115,6 +115,7 @@ const app = {
'q', 'q',
'stable-prs', 'stable-prs',
'version', 'version',
'npm-publish',
].forEach((command) => { ].forEach((command) => {
vorpal.use(require(`./commands/${command}`)(vorpal, app)); vorpal.use(require(`./commands/${command}`)(vorpal, app));
}); });

View File

@ -0,0 +1,74 @@
// Publishes the built npm packages from build/packages
// 1. Show checklist (automate later)
// 2. Prompt to ensure build is complete
// 3. Prompt for dist-tag?
'use strict';
const path = require('path');
const semver = require('semver');
const chalk = require('chalk');
const glob = require('glob');
module.exports = function(vorpal, app) {
vorpal
.command('npm-publish')
.description('Update the version of React, useful while publishing')
.action(function (args) {
return new Promise((resolve, reject) => {
const currentVersion = app.getReactVersion();
const isStable = semver.prerelease(currentVersion) === null;
this.log(`Preparing to publish v${currentVersion}`);
if (isStable) {
this.log(`"latest" dist-tag will be added to this version`);
}
// TODO: show checklist
this.prompt([
{
type: 'confirm',
message: 'Did you run `grunt build` or `grunt release` and bump the version number?',
name: 'checklist'
},
]).then((answers) => {
if (!answers.checklist) {
return reject('Complete the build process first')
}
// We'll grab all the tarballs and publish those directly. This
// is how we've historically done it, though in the past it was
// just npm publish pkg1.tgz && npm publish pkg2.tgz. This
// avoided the need to cd and publish.
const tgz = glob.sync('build/packages/*.tgz', {
cwd: app.PATH_TO_REPO
});
// Just in case they didn't actually prep this.
// TODO: verify packages?
if (tgz.length === 0) {
reject('No built packages found');
}
// TODO: track success
tgz.forEach((file) => {
this.log(app.execInRepo(`npm publish ${file} --tag=next`));
});
if (isStable) {
tgz.forEach((file) => {
const pkg = path.parse(file).name
this.log(app.execInRepo(`npm dist-tag add ${pkg}@${currentVersion} latest`));
});
}
resolve();
})
});
});
}

View File

@ -8,6 +8,7 @@
"chalk": "^1.1.3", "chalk": "^1.1.3",
"colors": "^1.1.2", "colors": "^1.1.2",
"github-api": "^2.2.0", "github-api": "^2.2.0",
"glob": "^7.0.5",
"semver": "^5.3.0", "semver": "^5.3.0",
"vorpal": "^1.10.10" "vorpal": "^1.10.10"
}, },