diff --git a/package.json b/package.json
index cc63214d2099e3a71d37202d54833763b41c5a0d..9eac7bd0dbcc4e5e6dacd6f9b2d5771498df2d3d 100644
--- a/package.json
+++ b/package.json
@@ -12,7 +12,7 @@
   },
   "scripts": {
     "build": "node scripts/build.js",
-    "create-react-app": "node global-cli/index.js --scripts-version \"$PWD/`tasks/clean_pack.sh`\"",
+    "create-react-app": "tasks/cra.sh",
     "e2e": "tasks/e2e.sh",
     "start": "node scripts/start.js",
     "test": "node scripts/test.js --env=jsdom"
diff --git a/tasks/cra.sh b/tasks/cra.sh
new file mode 100755
index 0000000000000000000000000000000000000000..726c6de84991e1666b2ae1aed5c4cd4de6b5d4a0
--- /dev/null
+++ b/tasks/cra.sh
@@ -0,0 +1,91 @@
+#!/bin/bash
+# Copyright (c) 2015-present, Facebook, Inc.
+# All rights reserved.
+#
+# This source code is licensed under the BSD-style license found in the
+# LICENSE file in the root directory of this source tree. An additional grant
+# of patent rights can be found in the PATENTS file in the same directory.
+
+# ******************************************************************************
+# This creates an app with the global CLI and `react-scripts` from the source.
+# It is useful for testing the end-to-end flow locally.
+# ******************************************************************************
+
+# Start in tasks/ even if run from root directory
+cd "$(dirname "$0")"
+
+function cleanup {
+  echo 'Cleaning up.'
+  cd $root_path
+  # Uncomment when snapshot testing is enabled by default:
+  # rm ./template/src/__snapshots__/App.test.js.snap
+  rm -rf $clean_path
+}
+
+# Error messages are redirected to stderr
+function handle_error {
+  echo "$(basename $0): ERROR! An error was encountered executing line $1." 1>&2;
+  cleanup
+  echo 'Exiting with error.' 1>&2;
+  exit 1
+}
+
+function handle_exit {
+  cleanup
+  echo 'Exiting without error.' 1>&2;
+  exit
+}
+
+# Exit the script with a helpful error message when any error is encountered
+trap 'set +x; handle_error $LINENO $BASH_COMMAND' ERR
+
+# Cleanup before exit on any termination signal
+trap 'set +x; handle_exit' SIGQUIT SIGTERM SIGINT SIGKILL SIGHUP
+
+# Echo every command being executed
+set -x
+
+# Go to root
+cd ..
+root_path=$PWD
+
+# ******************************************************************************
+# Pack react-scripts so we can verify they work.
+# ******************************************************************************
+
+# Packing react-scripts takes some work because we want to clean it up first.
+# Create a temporary clean folder that contains production only code.
+# Do not overwrite any files in the current folder.
+clean_path=`mktemp -d 2>/dev/null || mktemp -d -t 'clean_path'`
+
+# Copy some of the project files to the temporary folder.
+# Exclude folders that definitely won’t be part of the package from processing.
+# We will strip the dev-only code there, `npm pack`, and copy the package back.
+cd $root_path
+rsync -av --exclude='.git' --exclude=$clean_path\
+  --exclude='node_modules' --exclude='build'\
+  './' $clean_path  >/dev/null
+
+# Open the clean folder
+cd $clean_path
+# Now remove all the code relevant to development of Create React App.
+files="$(find -L . -name "*.js" -type f)"
+for file in $files; do
+  sed -i.bak '/\/\/ @remove-on-publish-begin/,/\/\/ @remove-on-publish-end/d' $file
+  rm $file.bak
+done
+
+# Finally, pack react-scripts
+cp -rf $root_path/node_modules $clean_path
+scripts_path=$clean_path/`npm pack`
+
+# ******************************************************************************
+# Now that we have packed them, call the global CLI.
+# ******************************************************************************
+
+# Go back to the root directory and run the command from here
+cd $root_path
+node global-cli/index.js --scripts-version=$scripts_path "$@"
+
+# Cleanup
+cleanup
diff --git a/tasks/e2e.sh b/tasks/e2e.sh
index b49c4934197674529b1e0ee33a963c4be7697d51..0cd92b0d25ed6d1456eeec7de5b4340faf439dd3 100755
--- a/tasks/e2e.sh
+++ b/tasks/e2e.sh
@@ -6,6 +6,11 @@
 # LICENSE file in the root directory of this source tree. An additional grant
 # of patent rights can be found in the PATENTS file in the same directory.
 
+# ******************************************************************************
+# This is an end-to-end test intended to run on CI.
+# You can also run it locally but it's slow.
+# ******************************************************************************
+
 # Start in tasks/ even if run from root directory
 cd "$(dirname "$0")"
 
@@ -14,7 +19,7 @@ function cleanup {
   cd $root_path
   # Uncomment when snapshot testing is enabled by default:
   # rm ./template/src/__snapshots__/App.test.js.snap
-  rm -rf $temp_cli_path $temp_app_path
+  rm -rf $temp_cli_path $temp_app_path $clean_path
 }
 
 # Error messages are redirected to stderr
@@ -102,10 +107,6 @@ for file in $files; do
   rm $file.bak
 done
 
-# A hacky way to avoid bundling dependencies.
-# Packing with them enabled takes too much memory, and Travis crashes.
-perl -i -p0e 's/bundledDependencies.*?]/bundledDependencies": []/s' package.json
-
 # Finally, pack react-scripts
 npm install
 scripts_path=$clean_path/`npm pack`
diff --git a/tasks/release.sh b/tasks/release.sh
index 01779cfb9be8d6abaa0ff03a834130ddd406b06c..83c9fefada069c117db4feaf156a81786bb2b87f 100755
--- a/tasks/release.sh
+++ b/tasks/release.sh
@@ -6,6 +6,13 @@
 # LICENSE file in the root directory of this source tree. An additional grant
 # of patent rights can be found in the PATENTS file in the same directory.
 
+# ******************************************************************************
+# This releases an update to the `react-scripts` package.
+# Don't use `npm publish` for it.
+# Read the release instructions:
+# https://github.com/facebookincubator/create-react-app/blob/master/CONTRIBUTING.md#cutting-a-release
+# ******************************************************************************
+
 # Start in tasks/ even if run from root directory
 cd "$(dirname "$0")"