node.js + ejs + python + shell > Autopack service

4689 ワード

初志
需要駆動開発、ハイブリッド開発プロジェクトのため、フロントエンドの同僚は絶えずパッケージテストを必要とし、専門のパッケージ員になることを避けるために、自動パッケージサービスを考えて、フロントエンドの同僚は私のウェブサイトにアクセスしてコードを提出して、それから打ったインストールパッケージをダウンロードすることができます.
ターゲット
  • は、コード圧縮パケット
  • をアップロードすることができる.
  • は自動梱包可能
  • インストールパッケージ
  • をダウンロードできます.
    使うもの
  • node.js (express)
  • ejs
  • python(不要)
  • shell

  • ステップ
    nodeをインストールします.js
    直接公式サイトにインストールするか、私の別のブログ:ゼロからノードサービスを構築します.
    express,ejsのインストール
    $ npm i express --save
    $ npm i ejs --save
    

    プロジェクトの初期化
    $ npm init
    $ touch index.js
    $ mkdir views   // ejs   
    
    /*    index.js */
    const express = require('express')
    const path = require('path')
    const app = express()
    
    app.set('views', path.join(__dirname, 'views'))  //            
    app.set('view engine', 'ejs')  //         ejs
    
    app.get('/', function (req, res) {
        res.send('hello, express')
    })
    app.listen(3000)
    

    ホームページ作成
    $ cd views
    $ touch home.ejs
    
    /*    home.ejs */
    
    
    
           
    
    
        
       
       
    /* index.js */ app.get('/', function (req, res) { res.render('home') })

    Nodeサービス受信コード圧縮パッケージ
  • はミドルウェアformidable
  • を用いる.
    $ npm i formidable --save
    
    /*   index.js        */
    /* upload */
    const formidable = require('formidable')
    
    app.post('/upload', function (req, res) {
        var form = formidable.IncomingForm()
        form.uploadDir = './source/upload'
        form.keepExtensions = true
        form.parse(req, function(err, fields, files) {
    
        })
    })
    

    nodeサービス解凍コード
  • ミドルウェアprogress-extract
  • を使用
    $ npm i progress-extract --save
    
    /*   index.js  */
    const extract = require('progress-extract')
    
    let target = process.cwd()
    extract(files.uploadFile.path, target + '/source/upload')
        .then(() => {
            console.log('extract succeed')
        }, err => {
            console.log('extract failed')
    })
    

    pythonスクリプト古いコードの置き換え
  • はshutil
  • を用いる.
    $ touch copyFile.py
    $ open -sublime copyFile.py
    
    /* copyFile.py */
    import shutil
    shutil.rmtree('./source/basesource/sgcis/platforms/ios/www')  //      
    shutil.copytree('./source/upload/www', "./source/basesource/sgcis/platforms/ios/www")  //      
    
  • エラー報告権限不足解決:
  • $ chmod a+x copyFile.py
    

    node呼び出しpythonスクリプト
  • childを使用しましたprocess
  • /*    index.js */
    const exec = require('child_process').exec;
    
    exec('python3 ./source/basesource/copyFile.py', function (err, stdout, srderr) {
                if(err) {
                    console.log(srderr);
                } else {
                    console.log(stdout);
                }
            });
    

    Node呼び出し自動パッケージングshellスクリプト
  • 自動パッケージングスクリプト別のブログを参照してください:shellスクリプト自動パッケージングパブリケーション
  • /*    index.js */
    const execFile = require('child_process').execFile;
    
    execFile('./source/basesource/autoPackage.sh',{encoding:'utf8'},function (err,stdout,stderr){
            if (err){
                console.log(err);                           
            } else {
                console.log(stdout)
                console.log('autoPackage.sh success')
            }
    });
    

    Nodeサービスはユーザーにインストールパッケージをダウンロードします
  • ダウンロードページ
  • を提供する
    $ touch download.ejs
    
    /*    download.ejs */
    
    
    
           
    
    
        

       
  • 応答ダウンロード
  • /*    index.js */
    const fs = require("fs")
    
    /* download */
    app.get('/download', function (req, res) {
        var filePath = './source/package/ipa/sgcis.ipa'
        var stats = fs.statSync(filePath); 
        if (stats.isFile()) {
            res.set({
                'Content-Type': 'application/octet-stream',
                'Content-Disposition': 'attachment; filename=sgcis.ipa',
                'Content-Length': stats.size
            });
            fs.createReadStream(filePath).pipe(res);
        } else {
            res.end(404);
        }
    })
    

    まとめ
  • demoアドレス:APNodeService.
  • pythonスクリプトの機能はshellスクリプトで実現できます.
  • routerは未使用で、改善できるところがたくさんあります.