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
			| 
											3 years ago
										 | '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); | ||
|  |     }); | ||
|  |   }); | ||
|  | } |