Add support for yarn and lerna monorepos. (#3741)

* Support for multiple source paths via package.json srcPaths entry.

Initial support for yarn workspace.

Support lerna workspace, fix for when to use template files.

Remove support for specifying srcPaths in package.json.

Re-enable transpilation caching.

* Clean up, use file matching (similar to original) in webpack configs instead of matching function.

* Remove package lock files.

* Fix for eject.
Note: monorepos won't work after eject.
Can be fixed easily with JEST 22.0.?+ which has file pattern matches against realpaths.

* Filter tests to run only tests in monorepo components included by the app.
(Not sure this is desireable, might be cool to be able to easily run all tests in monorepo from one app.)

* Fix conditions for when to use template.

* Fix eject.

* Remove code that is not needed w/ Jest 22.

* Include all cra-comp tests in monorepo instead of trying to include only tests that are dependencies of app.
(tests can be easily filtered via jest cli if desired, e.g. 'npm test -- myapp comp1')

* Pin find-pkg version.

* Hopefully fix jest test file matching on windows by removing first slash.

* E2E tests for monorepo.

* Run monorepo tests in CI.

* Fix and test post-eject build.

* Fix e2e test.

* Fix test suite names in appveyor.

* Include individual package dirs as srcPaths instead of top-level monorepo root.
Fixes build/start after eject.

* Fix running tests after eject.

* Clean up test workspace, add some verifcations.

* Cleanup.

* Try to fix hang when running test on appveyor.

* Don't write babel or lint config to package.json when ejecting.

* Incorporate review comments.
* Simply monorepo pkg finder
* Only include monorepo pkgs if app itself is included in monorepo
* Check for specific tests in e2e

* Fixes for windows.

* Fix for kitchensink mocha tests compiling.

* Add lerna monorepo test.

* Fix lerna bootstrap on windows.

* Incorporate more review comments:
* remove support for lerna w/o yarn workspace
* add react and react-dom as devDeps to comp1 and comp2

* Add monorepo info to user guide.
This commit is contained in:
bradfordlemley
2018-02-01 13:58:18 -07:00
committed by Dan Abramov
parent 5348d6eecf
commit b43ad04b88
33 changed files with 534 additions and 51 deletions

View File

@@ -146,10 +146,6 @@ PORT=3001 \
nohup yarn start &>$tmp_server_log &
grep -q 'You can now view' <(tail -f $tmp_server_log)
# Before running Mocha, specify that it should use our preset
# TODO: this is very hacky and we should find some other solution
echo '{"presets":["react-app"]}' > .babelrc
# Test "development" environment
E2E_URL="http://localhost:3001" \
REACT_APP_SHELL_ENV_MESSAGE=fromtheshell \
@@ -166,10 +162,6 @@ E2E_FILE=./build/index.html \
PUBLIC_URL=http://www.example.org/spa/ \
node_modules/.bin/mocha --compilers js:@babel/register --require @babel/polyfill integration/*.test.js
# Remove the config we just created for Mocha
# TODO: this is very hacky and we should find some other solution
rm .babelrc
# ******************************************************************************
# Finally, let's check that everything still works after ejecting.
# ******************************************************************************

135
tasks/e2e-monorepos.sh Executable file
View File

@@ -0,0 +1,135 @@
#!/bin/bash
# Copyright (c) 2015-present, Facebook, Inc.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
# ******************************************************************************
# 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")"
# App temporary location
# http://unix.stackexchange.com/a/84980
temp_app_path=`mktemp -d 2>/dev/null || mktemp -d -t 'temp_app_path'`
custom_registry_url=http://localhost:4873
original_npm_registry_url=`npm get registry`
original_yarn_registry_url=`yarn config get registry`
function cleanup {
echo 'Cleaning up.'
cd "$root_path"
# Uncomment when snapshot testing is enabled by default:
# rm ./packages/react-scripts/template/src/__snapshots__/App.test.js.snap
rm -rf "$temp_app_path"
npm set registry "$original_npm_registry_url"
yarn config set registry "$original_yarn_registry_url"
}
# 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
}
# Check for the existence of one or more files.
function exists {
for f in $*; do
test -e "$f"
done
}
# 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
if hash npm 2>/dev/null
then
npm i -g npm@latest
npm cache clean || npm cache verify
fi
# Bootstrap create-react-app monorepo
yarn
# Start local registry
tmp_registry_log=`mktemp`
nohup npx verdaccio@2.7.2 &>$tmp_registry_log &
# Wait for `verdaccio` to boot
grep -q 'http address' <(tail -f $tmp_registry_log)
# Set registry to local registry
npm set registry "$custom_registry_url"
yarn config set registry "$custom_registry_url"
# Login so we can publish packages
npx npm-cli-login@0.0.10 -u user -p password -e user@example.com -r "$custom_registry_url" --quotes
git clean -df
./tasks/publish.sh --yes --force-publish=* --skip-git --cd-version=prerelease --exact --npm-tag=latest
function verifyTest {
CI=true yarn test --watch=no --json --outputFile testoutput.json || return 1
cat testoutput.json
# on windows, output contains double backslashes for path separator
grep -E -q "src([\\]{1,2}|/)App.test.js" testoutput.json || return 1
grep -E -q "comp1([\\]{1,2}|/)index.test.js" testoutput.json || return 1
grep -E -q "comp2([\\]{1,2}|/)index.test.js" testoutput.json || return 1
}
function verifyBuild {
yarn build || return 1
grep -F -R --exclude=*.map "YarnWS-CraApp" build/ -q || return 1
}
# ******************************************************************************
# Test yarn workspace monorepo
# ******************************************************************************
# Set up yarn workspace monorepo
pushd "$temp_app_path"
cp -r "$root_path/packages/react-scripts/fixtures/monorepos/yarn-ws" .
cd "yarn-ws"
cp -r "$root_path/packages/react-scripts/fixtures/monorepos/packages" .
yarn
# Test cra-app1
cd packages/cra-app1
verifyBuild
yarn start --smoke-test
verifyTest
# Test eject
echo yes | npm run eject
verifyBuild
yarn start --smoke-test
verifyTest
# ******************************************************************************
# Test create-react-app inside workspace
# ******************************************************************************
# npx create-react-app --internal-testing-template="$root_path"/packages/react-scripts/fixtures/yarn-ws/ws/cra-app1 cra-app2
# -- above needs https://github.com/facebookincubator/create-react-app/pull/3435 to user create-react-app
popd
# Cleanup
cleanup

View File

@@ -49,7 +49,7 @@ while [ "$1" != "" ]; do
shift
done
test_command="./tasks/e2e-simple.sh && ./tasks/e2e-kitchensink.sh && ./tasks/e2e-installs.sh"
test_command="./tasks/e2e-simple.sh && ./tasks/e2e-kitchensink.sh && ./tasks/e2e-installs.sh && ./tasks/e2e-monorepos.sh"
case ${test_suite} in
"all")
;;
@@ -62,6 +62,9 @@ case ${test_suite} in
"installs")
test_command="./tasks/e2e-installs.sh"
;;
"monorepos")
test_command="./tasks/e2e-monorepos.sh"
;;
*)
;;
esac