いっぺーちゃんの いろいろやってみよ~

Espruino on ESP32 モジュールインストーラ

モジュールを用意した後、逐一オンラインストレージのディスクイメージを作成して書き込むのは面倒なので、
node.jsのnpmのように、モジュールをサーバからインストールできるプログラムを用意します。
名前はなんでも良いのですが、mnpmとしました。
"mini-"npmというより、"もどき"npm かな?

 

以下のプログラムをオンラインストレージに /node_modules/mnpm.js というファイル名で保存しておきます。

SERVER_ADDRの設定は自分の環境に合わせて変更しておいてください。

 

/* NOTE:
    var mnpm = require("mnpm")後、
    mnpm("モジュール名")
   を実行する
*/

exports = function(moduleName) {
    var fs   = require("fs");
    var http = require("http");

    //var SERVER_ADDR = "http://www.espruino.com/modules/";
    var SERVER_ADDR = "http://192.168.XX.XX/modules/";              // サーバのアドレス
    var DIST_DIR    = "/node_modules";                              // インストール先

    var dist_file = DIST_DIR + '/' + moduleName + ".js";

    // 既にDIST_DIRが存在するか確認
    var st=fs.statSync(DIST_DIR);
    if (!st) {
        // 存在しなかったら作成する
        console.log("create directory: " + DIST_DIR);
        fs.mkdirSync(DIST_DIR);
        // 再度DIST_DIRが存在するか確認
        st=fs.statSync(DIST_DIR);
    }
    if (!st) {
        // 作成できなかった
        console.log(DIST_DIR + " is not exist!!");
        return;
    } else if (!st.dir) {
        // DIST_DIRがディレクトリでない
        console.log(DIST_DIR + " is not directory!!");
        return;
    } else {
        // DIST_DIRが存在する
        console.log(DIST_DIR + " check OK!!");
    }

    // 古いファイルを削除
    try {
        fs.unlinkSync(dist_file);
    } catch(e) {
        // エラーは無視
    }

    // サーバから取ってくる
    // File not foundでもエラーにならないから注意(そういう画面を受け取ってしまうので)
    http.get(SERVER_ADDR + moduleName + ".js", function(res) {
        res.on('data', function(data) { 
                // 受信したデータを追加書き込み
                fs.appendFileSync(dist_file, data);
        });
        res.on('close', function() { 
            console.log("DONE");
        });
    });
}

 

 以下のように実行すると、モジュールをインストールできます。

var mnpm = require("mnpm")
mnpm("モジュール名")

インストールが成功すると DONE と表示されます。

 

なお、一度読み込んだモジュールを再度mnpmで再インストールした場合は、
ESP32を一旦リセットするか、

Modules.removeCached("モジュール名")
または
Modules.removeAllCached()

 と実行して、モジュールキャッシュからデータを削除してから使用してください。 そうしないと、モジュールキャッシュに残った前回のモジュールが実行されてしまいます。