2017-09-01 39 views
0

我正在使用gulp与我的离子应用进行自动化。我已经设置了一个缩小我的JS,CSS,HTML文件的gulp过程并创建了一个构建目录。所以基本上我需要创建的Android APK但我有使用一饮而尽命令 如何使用gulp为离子应用设置APK的自动包装

  • 执行命令来创建发布版本做以下的事情

    1. 创建一个build文件夹wwwionic cordova build --release android
    2. 使用的jarsigner来签名APK:jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore HelloWorld-release-unsigned.apk alias_name

    最后,我的APK准备就绪,我通过更新它的名称与其他版本参数将它复制到今天的日期文件夹中的某个位置。 当我们需要更频繁的构建来交付QA时,这非常耗时。

    我的问题是现在我怎么才能创建一个使用gulp进程的一次性部署就绪APK?

  • 回答

    3

    我开发了一个梦幻般的解决方案,通过利用可用的方法和谷歌的一些不错的链接,即时创建签名的APK。

    让我们走一步看一步

    第1步:

    准备好与吞气过程,minifies,并将所有CSS,JS,HTML文件,在build目录即WWW和验证Android平台已被添加到项目中。

    第2步:

    使用生成的应用程序的keystore以下命令

    keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048

    拷贝keystore到项目的根。

    第3步:

    创建命名为build.json在项目的根目录下的新文件,并添加以下行到它。同时创造keystore

    { 
        "android": { 
         "debug": { 
          "keystore": "AnyName.keystore", 
          "storePassword": "password", 
          "alias": "AnyAliasName", 
          "password" : "password", 
          "keystoreType": "" 
         }, 
         "release": { 
          "keystore": "AnyName.keystore", 
          "storePassword": "password", 
          "alias": "AnyAliasName", 
          "password" : "password", 
          "keystoreType": "" 
         } 
        } 
    } 
    

    步骤设置keystore名和密码的细节,你已经进入4

    gulpfile.js

    npm install --save-dev gulp-cheerio 
    npm install --save-dev gulp-util 
    npm install --save-dev gulp-if 
    npm install --save-dev run-sequence 
    npm install --save-dev gulp-rename 
    npm install --save-dev yargs 
    

    第5步中添加代码之前安装以下一饮而尽插件。

    gulpfile.js中添加以下代码以创建APK &将其复制到今天的日期目录并重新命名。添加以下代码后好心添加build_app & release_task一饮而尽任务默认一饮而尽过程。

    var if = require('gulp-if'); 
        var runSequence = require('run-sequence'); 
        var rename = require('gulp-rename'); 
    
        // This plugin used to read XML file 
        var cheerio = require('gulp-cheerio'); 
    
        // This is gulp utility plugin 
        var util = require("gulp-util"); 
    
        // Used for executing any command line command 
        var exec = require('child_process').exec; 
    
        /** 
        * Command line options - defines whether this is a dev or release build 
        * e.g gulp -r or gulp -d. (gulp --release or gulp --develop) 
        * By default, just running 'gulp' is the same as running 'gulp -d' 
        */ 
        var args = require('yargs') 
         .alias('r', 'release') 
         .alias('d', 'develop') 
         .default('release', false) 
         .argv; 
    
        var release = args.release; 
        // Used to create directory with today's date 
        var releaseDirName = util.date('dd-mmm-yyyy'); 
    
        // Default path where signed apk is created 
        APK_PATH = './platforms/android/build/outputs/apk/android-release.apk' 
    
        APK_NAME = "<YOUR_APP_NAME>"; 
    
        // The following popup is used to give popup notification in windows when APK is ready 
        var WINDOWS_POPUP = "msg * MESSAGE"; 
    
        // This command creates the signed APK using configuration in build.json 
        var ANDROID_SIGNED_APK_COMMAND = 'cordova build android --release --buildConfig'; 
    
        /** 
        * Create signed APK 
        */ 
        gulp.task('build_app', function (cb) { 
         if(args.signedAPK){ 
          console.log('Building signed apk...'); 
          exec(ANDROID_SIGNED_APK_COMMAND, 
          { 
           cwd : './', 
           maxBuffer: 1024 * 1024 
          }, 
          function (err, stdout, stderr) { 
           console.log(stdout); 
           console.log(stderr); 
           cb(err); 
          }); 
         } 
        } 
    
    
        /** 
        * Common function for executing commands 
        * @param cmd 
        * @param cb 
        * @returns 
        */ 
        function execCMD(cmd, cb){ 
         exec(cmd, 
         { 
          cwd : './', 
          maxBuffer: 1024 * 1024 
         }, 
         function (err, stdout, stderr) { 
          console.log(stdout); 
          console.log(stderr); 
          if(err){ 
           cb(err); 
          }else{ 
           cb(); 
          } 
         }); 
        } 
    
        /** 
        * Reads XML file for getting version 
        */ 
        gulp.task('config_xml', function() { 
         return gulp.src('./config.xml') 
         .pipe(cheerio({ 
          run: function ($) { 
    
          // set app version number 
          APK_NAME += '_' + $('widget').attr('version'); 
          }, 
          parserOptions: { 
          xmlMode: true 
          } 
         })) 
         .pipe(gulp.dest('./')); 
        }); 
    
        /** 
        * release task 
        */ 
        gulp.task('releaseTask',function(callback) { 
         if(args.signedAPK){ 
          runSequence(
           'copyAPK', 
           callback 
          ) 
         } 
        }); 
    
        /** 
        * Rename android apk 
        */ 
        gulp.task('copyAPK',function(callback) { 
         return gulp.src(APK_PATH) 
          .pipe(if(args.signedAPK,rename(APK_NAME))) 
          .pipe(gulp.dest(releaseDirName + '/Android/')) 
          .on('end', function(){ 
           util.log(util.colors.green('Good Job! Your APK is ready at following location : ') + util.colors.cyan(releaseDirName + '/Android/' + APK_NAME)) 
           execCMD(WINDOWS_POPUP.replace('MESSAGE','Good Job! Your APK is ready at following location : ' + releaseDirName + '/Android/' + APK_NAME), function(err){}) 
          }); 
        }); 
    

    第6步:

    创建任何名称的bat文件。我曾与Signed APK <My Project Name>.bat 认沽按照bat文件代码中创建它。

    cd /d %~dp0 
    gulp --release --signedAPK 
    cmd.exe 
    

    将此bat文件保存在项目的根目录中。

    cd /d %~dp0 
    

    上述代码跳转到bat文件所在的目录。

    gulp --release --signedAPK 
    

    和上面的一个创造签署的Android APK的的

    第7步:

    不要等到什么...请转到项目,然后双击bat文件,这就是它......的签名APK将等待着你在今天的日期文件夹在项目中。

    +0

    我收到了'args'变量错误。任何关于它的想法。 –

    +0

    对不起,我没有提到加载“yargs”节点mobule。我已经更新了答案。请立即检查。只要安装“yargs”模块,并在你的'gulpfile.js'使用 –