From 107dc62dd7fa90324d01658e6bcb514eca02d00a Mon Sep 17 00:00:00 2001 From: Dannii Willis Date: Fri, 9 Oct 2020 11:28:43 +1000 Subject: [PATCH] Skip installing optional npm deps, but manually install Closure Compiler native package (#636) Follow on to #625, #630, #632, #633 Fixes emscripten-core/emscripten#12406 --- emsdk.py | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/emsdk.py b/emsdk.py index 39637b9..ee5452d 100644 --- a/emsdk.py +++ b/emsdk.py @@ -1223,13 +1223,41 @@ def emscripten_npm_install(tool, directory): print('Running post-install step: npm ci ...') try: subprocess.check_output( - [npm, 'ci', '--production'], + [npm, 'ci', '--production', '--no-optional'], cwd=directory, stderr=subprocess.STDOUT, env=env, universal_newlines=True) except subprocess.CalledProcessError as e: print('Error running %s:\n%s' % (e.cmd, e.output)) return False + # Manually install the appropriate native Closure Compiler package + # This is currently needed because npm ci will install the packages + # for Closure for all platforms, adding 180MB to the download size + # There are two problems here: + # 1. npm ci does not consider the platform of optional dependencies + # https://github.com/npm/cli/issues/558 + # 2. A bug with the native compiler has bloated the packages from + # 30MB to almost 300MB + # https://github.com/google/closure-compiler-npm/issues/186 + # If either of these bugs are fixed then we can remove this exception + closure_compiler_native = '' + if LINUX and ARCH in ('x86', 'x86_64'): + closure_compiler_native = 'google-closure-compiler-linux' + if MACOS and ARCH in ('x86', 'x86_64'): + closure_compiler_native = 'google-closure-compiler-osx' + if WINDOWS and ARCH == 'x86_64': + closure_compiler_native = 'google-closure-compiler-windows' + if closure_compiler_native: + print('Running post-install step: npm install', closure_compiler_native) + try: + subprocess.check_output( + [npm, 'install', closure_compiler_native], + cwd=directory, stderr=subprocess.STDOUT, env=env, + universal_newlines=True) + except subprocess.CalledProcessError as e: + print('Error running %s:\n%s' % (e.cmd, e.output)) + return False + print('Done running: npm ci') return True