產品上線需要接入公司打包平台
使用web端執行打包腳本執行打包任務
打包過程中需要完成引擎生成、項目生成、圖片壓縮、文件名MD5重命名、ZIP打包壓縮等操作
由於打包機器是公司‘內定’的mac機
所以打包腳本選擇了shell+nodejs
轉載注明出處http://www.cnblogs.com/billyrun/articles/7474937.html
1.引擎代碼生成
引擎代碼就是項目中的cocos2d-js.js/cocos2d-js-min.js
當使用默認js引擎時是不需要手動生成引擎代碼的
若此次打包修改了引擎源碼,就需要手動生成新的引擎代碼文件
項目中可以記錄引擎目錄的svn版本號來確認引擎是否有更新
若有更新,執行gulp build即可(如果不想配環境變量,可以直接執行node ./node_modules/gulp/bin/gulp.js build)
配置方法參考官方文檔http://www.cocos.com/docs/creator/advanced-topics/engine-customization.html
使用自定義引擎還需要手動設置引擎地址
具體的講就是修改一個json文件
C:\Users\xxx\.CocosCreator\settings.json(windows)
/Users/xxx/.CocosCreator/settings.json(mac)
將json文件中js-engine-path改寫為自定義引擎路徑,use-default-js-engine設為false
2.項目生成
腳本生成項目如同面板中點擊‘項目’-‘構建發布’
命令形如
$CREATOR_PATH --path $PROJECT_PATH --build "buildPath=${BUILD_PATH};platform=${PLATFORM}"
build中其余常用參數還有 startScene/webOrientation/debug等
詳細可參考官方文檔http://www.cocos.com/docs/creator/publish/publish-in-command-line.html
3.文件名MD5
項目采用了類似頁游的更新策略
文件名后綴+md5碼唯一確定文件版本
在Creator1.6+版本好像可以自動MD5
無奈我做的時候還沒有1.6
這里使用nodejs完成文件遍歷與MD5操作
幾個常用模塊和操作如下
require('fs') 文件處理
require('path') 路徑/文件名處理
require('crypto') MD5計算
require('child_process') 子進程/調用其他程序
fs.stat 判斷isFile 文件還是文件夾
fs.readdir 遍歷指定目錄
fs.writeFileSync 寫入記錄文件名與MD5碼映射關系
fs.renameSync 重命名
MD5具體操作如下
var md5sum = crypto.createHash('md5') var stream = fs.createReadStream(path) stream.on('data' , function(chunk){md5sum.update(chunk)}) stream.on('end' , function(){ var md5Code = md5sum.digest('hex') // rename by md5 code })
4.圖片壓縮
圖片壓縮使用了兩個工具分別處理png/jpg
分別是pngquant/ImageMagick
具體調用在遍歷文件時使用path.extname判斷后綴名
然后由child_process.exec(commandString , callback)子進程中異步壓縮
png命令
command = pngEnginePath + ' --force --ext .png ' + imgPath
jpg命令
commang = 'export DYLD_LIBRARY_PATH="'+JPG_ENGINE_LIB+'" && ' + jpgEnginePath + ' -quality 70 -strip ' + imgPath + ' ' + imgPath
這個略復雜,首先要export它的library,然后設置原圖路徑和壓縮后圖片路徑
在執行圖片壓縮以前
還需要處理這兩個工具的執行權限
command = ‘chmod a+x ’ + enginePath
5.ZIP打包
mac命令如下
zip -qr to from
zip -qr ../${zipName} res src cocos2d*
即壓縮res/src兩個文件夾和cocos2d開頭的文件(cocos2d-js.js/cocos2d-js-min.js)至指定目錄保存為zipName
大概就總結這么多吧
nodejs效率還是蠻高的
循環遍歷文件夾要比shell快很多!