You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							74 lines
						
					
					
						
							2.3 KiB
						
					
					
				
			
		
		
	
	
							74 lines
						
					
					
						
							2.3 KiB
						
					
					
				| 'use strict';
 | |
| 
 | |
| module.exports = exports = _package;
 | |
| 
 | |
| exports.usage = 'Packs binary (and enclosing directory) into locally staged tarball';
 | |
| 
 | |
| const fs = require('fs');
 | |
| const path = require('path');
 | |
| const log = require('npmlog');
 | |
| const versioning = require('./util/versioning.js');
 | |
| const napi = require('./util/napi.js');
 | |
| const existsAsync = fs.exists || path.exists;
 | |
| const makeDir = require('make-dir');
 | |
| const tar = require('tar');
 | |
| 
 | |
| function readdirSync(dir) {
 | |
|   let list = [];
 | |
|   const files = fs.readdirSync(dir);
 | |
| 
 | |
|   files.forEach((file) => {
 | |
|     const stats = fs.lstatSync(path.join(dir, file));
 | |
|     if (stats.isDirectory()) {
 | |
|       list = list.concat(readdirSync(path.join(dir, file)));
 | |
|     } else {
 | |
|       list.push(path.join(dir, file));
 | |
|     }
 | |
|   });
 | |
|   return list;
 | |
| }
 | |
| 
 | |
| function _package(gyp, argv, callback) {
 | |
|   const package_json = gyp.package_json;
 | |
|   const napi_build_version = napi.get_napi_build_version_from_command_args(argv);
 | |
|   const opts = versioning.evaluate(package_json, gyp.opts, napi_build_version);
 | |
|   const from = opts.module_path;
 | |
|   const binary_module = path.join(from, opts.module_name + '.node');
 | |
|   existsAsync(binary_module, (found) => {
 | |
|     if (!found) {
 | |
|       return callback(new Error('Cannot package because ' + binary_module + ' missing: run `node-pre-gyp rebuild` first'));
 | |
|     }
 | |
|     const tarball = opts.staged_tarball;
 | |
|     const filter_func = function(entry) {
 | |
|       const basename = path.basename(entry);
 | |
|       if (basename.length && basename[0] !== '.') {
 | |
|         console.log('packing ' + entry);
 | |
|         return true;
 | |
|       } else {
 | |
|         console.log('skipping ' + entry);
 | |
|       }
 | |
|       return false;
 | |
|     };
 | |
|     makeDir(path.dirname(tarball)).then(() => {
 | |
|       let files = readdirSync(from);
 | |
|       const base = path.basename(from);
 | |
|       files = files.map((file) => {
 | |
|         return path.join(base, path.relative(from, file));
 | |
|       });
 | |
|       tar.create({
 | |
|         portable: false,
 | |
|         gzip: true,
 | |
|         filter: filter_func,
 | |
|         file: tarball,
 | |
|         cwd: path.dirname(from)
 | |
|       }, files, (err2) => {
 | |
|         if (err2)  console.error('[' + package_json.name + '] ' + err2.message);
 | |
|         else log.info('package', 'Binary staged at "' + tarball + '"');
 | |
|         return callback(err2);
 | |
|       });
 | |
|     }).catch((err) => {
 | |
|       return callback(err);
 | |
|     });
 | |
|   });
 | |
| }
 |