@samitouri / QOS-React / commits / 54bfab5d6d

Release script updates private package dependencies also (#13612)

Brian Vaughn committed Sep 10, 2018 at 13:14 UTC 54bfab5d6d9e0e313fbedbe76979c59470fbe140
3 files changed +38 -4
scripts/release/build-commands/update-package-versions.js
+11 -2
@@ -58,8 +58,11 @@ const update = async ({cwd, dry, packages, version}) => {
58 const json = await readJson(path);
59 const prerelease = semver.prerelease(version);
60
61 - // Unstable package version.
62 - json.version = getNextVersion(json.version, version);
61 + // If this is a package we publish directly to NPM, update its version.
62 + // Skip ones that we don't directly publish though (e.g. react-native-renderer).
63 + if (json.private !== true) {
64 + json.version = getNextVersion(json.version, version);
65 + }
66
67 if (project === 'react') {
68 // Update inter-package dependencies as well.
@@ -107,6 +110,12 @@ const update = async ({cwd, dry, packages, version}) => {
110 Object.keys(json.dependencies).forEach(dependency => {
111 if (packages.indexOf(dependency) >= 0) {
112 const prevVersion = json.dependencies[dependency];
113 +
114 + // Special case to handle e.g. react-noop-renderer
115 + if (prevVersion === '*') {
116 + return;
117 + }
118 +
119 const nextVersion = getNextVersion(
120 prevVersion.replace('^', ''),
121 version
scripts/release/build.js
+9 -2
@@ -8,7 +8,7 @@ const {exec} = require('child_process');
8 const run = async () => {
9 const chalk = require('chalk');
10 const logUpdate = require('log-update');
11 - const {getPublicPackages} = require('./utils');
11 + const {getPublicPackages, getPackages} = require('./utils');
12
13 const addGitTag = require('./build-commands/add-git-tag');
14 const buildArtifacts = require('./build-commands/build-artifacts');
@@ -31,6 +31,7 @@ const run = async () => {
31 try {
32 const params = parseBuildParameters();
33 params.packages = getPublicPackages();
34 +
35 await checkEnvironmentVariables(params);
36 await validateVersion(params);
37 await checkUncommittedChanges(params);
@@ -41,7 +42,13 @@ const run = async () => {
42 await checkPackageDependencies(params);
43 await updateYarnDependencies(params);
44 await runAutomatedTests(params);
44 - await updatePackageVersions(params);
45 + // Also update NPM dependencies for private packages (e.g. react-native-renderer)
46 + // Even though we don't publish these to NPM,
47 + // mismatching dependencies can cause `yarn install` to install duplicate packages.
48 + await updatePackageVersions({
49 + ...params,
50 + packages: getPackages(),
51 + });
52 await updateNoopRendererDependencies(params);
53 await buildArtifacts(params);
54 await runAutomatedBundleTests(params);
scripts/release/utils.js
+18
@@ -23,6 +23,23 @@ const execUnlessDry = async (command, {cwd, dry}) => {
23 }
24 };
25
26 +const getPackages = () => {
27 + const packagesRoot = join(__dirname, '..', '..', 'packages');
28 +
29 + return readdirSync(packagesRoot).filter(dir => {
30 + const packagePath = join(packagesRoot, dir, 'package.json');
31 +
32 + if (dir.charAt(0) !== '.' && statSync(packagePath).isFile()) {
33 + const packageJSON = JSON.parse(readFileSync(packagePath));
34 +
35 + // Skip packages like "shared" and "events" that shouldn't be updated.
36 + return packageJSON.version !== '0.0.0';
37 + }
38 +
39 + return false;
40 + });
41 +};
42 +
43 const getPublicPackages = () => {
44 const packagesRoot = join(__dirname, '..', '..', 'packages');
45
@@ -99,6 +116,7 @@ const runYarnTask = async (cwd, task, errorMessage) => {
116 module.exports = {
117 execRead,
118 execUnlessDry,
119 + getPackages,
120 getPublicPackages,
121 getUnexecutedCommands,
122 logPromise,