mirror of
https://github.com/keymanapp/keyman.git
synced 2026-08-08 09:55:32 +00:00
Note that the version entry will be added to the local package.json which will then be dirty. This version entry should not be committed.
189 lines
5.1 KiB
Bash
Executable file
189 lines
5.1 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
#
|
|
# Compiles Keyman Developer Server for deployment
|
|
#
|
|
|
|
# Exit on command failure and when using unset variables:
|
|
set -eu
|
|
|
|
## START STANDARD BUILD SCRIPT INCLUDE
|
|
# adjust relative paths as necessary
|
|
THIS_SCRIPT="$(greadlink -f "${BASH_SOURCE[0]}" 2>/dev/null || readlink -f "${BASH_SOURCE[0]}")"
|
|
. "$(dirname "$THIS_SCRIPT")/../../resources/build/build-utils.sh"
|
|
. "$KEYMAN_ROOT/resources/shellHelperFunctions.sh"
|
|
## END STANDARD BUILD SCRIPT INCLUDE
|
|
EX_USAGE=64
|
|
|
|
. "$KEYMAN_ROOT/resources/build/jq.inc.sh"
|
|
|
|
pushd "$(dirname "$THIS_SCRIPT")"
|
|
|
|
# Build the main script.
|
|
build () {
|
|
npm run build || fail "Could not build top-level JavaScript file."
|
|
}
|
|
|
|
display_usage ( ) {
|
|
echo "Usage: $0 [--production|--watch] [--test|--tdd]"
|
|
echo " $0 --help"
|
|
echo
|
|
echo " --help displays this screen and exits"
|
|
echo " --production, -p builds production release in build/"
|
|
echo " --skip-package-install, -S don't run npm install (not valid with --production)"
|
|
echo " --test, -t runs unit tests after building"
|
|
#echo " --watch, -w builds dev server in watch mode"
|
|
echo " --tdd runs unit tests WITHOUT building"
|
|
echo " --no-build-addins don't build/copy Win32 addins"
|
|
echo " --no-build-kmw don't build KeymanWeb"
|
|
echo " --no-copy-kmw don't copy KeymanWeb"
|
|
}
|
|
|
|
################################ Main script ################################
|
|
|
|
run_tests=0
|
|
production=0
|
|
build=1
|
|
install_dependencies=1
|
|
build_keymanweb=1
|
|
copy_keymanweb=1
|
|
build_addins=1
|
|
|
|
# Process command-line arguments
|
|
while [[ $# -gt 0 ]] ; do
|
|
key="$1"
|
|
case $key in
|
|
--help|-h|-?)
|
|
display_usage
|
|
exit
|
|
;;
|
|
--production|-p)
|
|
production=1
|
|
;;
|
|
--skip-package-install|-S)
|
|
install_dependencies=0
|
|
;;
|
|
--no-build-kmw)
|
|
build_keymanweb=0
|
|
;;
|
|
--no-build-addins)
|
|
build_addins=0
|
|
;;
|
|
--no-copy-kmw)
|
|
copy_keymanweb=0
|
|
;;
|
|
--test)
|
|
run_tests=1
|
|
;;
|
|
--tdd)
|
|
run_tests=1
|
|
build=0
|
|
install_dependencies=0
|
|
;;
|
|
*)
|
|
echo "$0: invalid option: $key"
|
|
display_usage
|
|
exit $EX_USAGE
|
|
esac
|
|
shift # past the processed argument
|
|
done
|
|
|
|
# ----------------------------------------
|
|
# Install dependencies
|
|
# ----------------------------------------
|
|
|
|
# Check if Node.JS/npm is installed.
|
|
type npm >/dev/null ||\
|
|
fail "Build environment setup error detected! Please ensure Node.js is installed!"
|
|
|
|
if (( install_dependencies )) ; then
|
|
verify_npm_setup
|
|
# See https://github.com/bubenshchykov/ngrok/issues/254, https://github.com/bubenshchykov/ngrok/pull/255
|
|
# TODO: this is horrible; is there a way we can avoid this?
|
|
rm -f "$KEYMAN_ROOT"/node_modules/ngrok/bin/ngrok.exe
|
|
fi
|
|
|
|
# ----------------------------------------
|
|
# Rebuild and bundle addins
|
|
# ----------------------------------------
|
|
|
|
if (( build_addins )); then
|
|
. ./build-addins.inc.sh
|
|
|
|
# If we have an x64 version of node installed
|
|
if [[ $(isNodeX64) ]]; then
|
|
build_addins
|
|
fi
|
|
|
|
# Build with the Keyman Developer x86 version of node
|
|
PATH="$KEYMAN_ROOT/developer/inst/dist:$PATH" build_addins
|
|
fi
|
|
|
|
# ----------------------------------------
|
|
# Build and bundle KeymanWeb
|
|
# ----------------------------------------
|
|
|
|
if (( build_keymanweb )); then
|
|
pushd "$KEYMAN_ROOT/web/source"
|
|
./build.sh -no_minify
|
|
popd
|
|
fi
|
|
|
|
if (( copy_keymanweb )); then
|
|
SRC="$KEYMAN_ROOT/web/release/unminified"
|
|
DST="$(dirname "$THIS_SCRIPT")/src/site/resource"
|
|
|
|
rm -rf "$DST"
|
|
mkdir -p "$DST/osk"
|
|
mkdir -p "$DST/ui"
|
|
cp "$SRC/web/"*.js "$SRC/web/"*.js.map "$DST/"
|
|
cp -R "$SRC/web/osk/"* "$DST/osk/"
|
|
cp -R "$SRC/web/ui/"* "$DST/ui/"
|
|
cp "$KEYMAN_ROOT/web/LICENSE" "$DST/"
|
|
cp "$KEYMAN_ROOT/web/README.md" "$DST/"
|
|
fi
|
|
|
|
# ----------------------------------------
|
|
# Build the project
|
|
# ----------------------------------------
|
|
|
|
npm run build || fail "Compilation failed."
|
|
echo "Typescript compilation successful."
|
|
|
|
# ----------------------------------------
|
|
# Unit tests
|
|
# ----------------------------------------
|
|
|
|
if (( run_tests )); then
|
|
npm test || fail "Tests failed"
|
|
fi
|
|
|
|
# ----------------------------------------
|
|
# Deploy to dist/
|
|
# ----------------------------------------
|
|
|
|
if (( production )) ; then
|
|
# We need to build in a tmp folder so that npm doesn't get confused by our
|
|
# monorepo setup, and so we can copy the relevant node_modules in, because
|
|
# we'll need them in order to build the deployable version.
|
|
|
|
PRODBUILDTEMP=`mktemp -d`
|
|
echo "Preparing in $PRODBUILDTEMP"
|
|
# Remove @keymanapp devDependencies because they won't install outside the
|
|
# monorepo context
|
|
cat package.json | "$JQ" \
|
|
'. | del(.devDependencies."@keymanapp/resources-gosh") | del(.devDependencies."@keymanapp/keyman-version")' \
|
|
> "$PRODBUILDTEMP/package.json"
|
|
|
|
pushd "$PRODBUILDTEMP"
|
|
npm install --omit=dev --omit=optional
|
|
# See https://github.com/bubenshchykov/ngrok/issues/254, https://github.com/bubenshchykov/ngrok/pull/255
|
|
rm -f node_modules/ngrok/bin/ngrok.exe
|
|
popd
|
|
|
|
# We'll build in the build/ folder
|
|
rm -rf build/
|
|
mkdir build/
|
|
cp -R dist/* build/
|
|
cp -R "$PRODBUILDTEMP"/* build/
|
|
rm -rf "$PRODBUILDTEMP"
|
|
fi
|