Add script to pack npm_binary tarballs with dependencies
Contrary to our experience with bower, not all packages on registry.npmjs.org come with dependencies bundled. This script produces a tarball with bundled dependencies which can be hosted on the Gerrit GCS bucket and used as an npm_binary. Change-Id: I2403c7f0acf759be2508b845d1f359cdf6a65e4e
This commit is contained in:
		
							
								
								
									
										74
									
								
								tools/js/npm_pack.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										74
									
								
								tools/js/npm_pack.py
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,74 @@ | ||||
| #!/usr/bin/env python | ||||
| # Copyright (C) 2015 The Android Open Source Project | ||||
| # | ||||
| # Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| # you may not use this file except in compliance with the License. | ||||
| # You may obtain a copy of the License at | ||||
| # | ||||
| # http://www.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| # Unless required by applicable law or agreed to in writing, software | ||||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
|  | ||||
| from __future__ import print_function | ||||
|  | ||||
| import atexit | ||||
| import json | ||||
| import os | ||||
| import shutil | ||||
| import subprocess | ||||
| import sys | ||||
| import tarfile | ||||
| import tempfile | ||||
|  | ||||
|  | ||||
| def is_bundled(tar): | ||||
|   # No entries for directories, so scan for a matching prefix. | ||||
|   for entry in tar.getmembers(): | ||||
|     if entry.name.startswith('package/node_modules/'): | ||||
|       return True | ||||
|   return False | ||||
|  | ||||
|  | ||||
| def bundle_dependencies(): | ||||
|   with open('package.json') as f: | ||||
|     package = json.load(f) | ||||
|   package['bundledDependencies'] = package['dependencies'].keys() | ||||
|   with open('package.json', 'w') as f: | ||||
|     json.dump(package, f) | ||||
|  | ||||
|  | ||||
| def main(args): | ||||
|   if len(args) != 2: | ||||
|     print('Usage: %s <package> <version>' % sys.argv[0], file=sys.stderr) | ||||
|     return 1 | ||||
|  | ||||
|   name, version = args | ||||
|   filename = '%s-%s.tgz' % (name, version) | ||||
|   url = 'http://registry.npmjs.org/%s/-/%s' % (name, filename) | ||||
|  | ||||
|   tmpdir = tempfile.mkdtemp(); | ||||
|   tgz = os.path.join(tmpdir, filename) | ||||
|   atexit.register(lambda: shutil.rmtree(tmpdir)) | ||||
|  | ||||
|   subprocess.check_call(['curl', '--proxy-anyauth', '-ksfo', tgz, url]) | ||||
|   with tarfile.open(tgz, 'r:gz') as tar: | ||||
|     if is_bundled(tar): | ||||
|       print('%s already has bundled node_modules' % filename) | ||||
|       return 1 | ||||
|     tar.extractall(path=tmpdir) | ||||
|  | ||||
|   oldpwd = os.getcwd() | ||||
|   os.chdir(os.path.join(tmpdir, 'package')) | ||||
|   bundle_dependencies() | ||||
|   subprocess.check_call(['npm', 'install']) | ||||
|   subprocess.check_call(['npm', 'pack']) | ||||
|   shutil.copy(filename, os.path.join(oldpwd, filename)) | ||||
|   return 0 | ||||
|  | ||||
|  | ||||
| if __name__ == '__main__': | ||||
|   sys.exit(main(sys.argv[1:])) | ||||
		Reference in New Issue
	
	Block a user
	 Dave Borowitz
					Dave Borowitz