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,