第5章 ローカルでのコード開発

概要

本章では、Red Hat Mobile Application Platform ホスト型 (RHMAP) 内でのモバイルアプリケーション開発用のローカル環境を設定する方法について説明します。アプリNode.js クラウド サーバー開発の両方が対象となります。

要件

以下のチュートリアルを終了していることを前提としています。

5.1. 開発ツール

fhc 、Node.js、および NPM 以外に、他の開発ツールが必要です。

5.1.1. Git

"Git は無償のオープンソースの分散型バージョン管理システムで、スピードと高い効率性で小さいものから大型のものまですべてのプロジェクトに対処できます。"

特定のオペレーティングシステムに git をインストールします。

  • RHEL / Fedora: Git Installation Page を参照してください。
  • Debian ベースのディストリビューション: sudo apt-get install git-core
  • Mac OSX: brew install git または sudo port install git-core +doc +bash_completion。もしくは、グラフィカルの git installer を使用します。
  • Windows: msysgit を参照してください。
注記

Mac OSX に Homebrew パッケージマネージャーをインストールするには、http://brew.sh/ を参照してください。

5.1.2. Grunt

"JavaScript タスクランナー"

grunt は NPM で利用可能です。インストールするには、以下のコマンドを実行します。

sudo npm install -g grunt-cli
注記

すべての RHMAP テンプレートアプリは grunt をローカル開発用のタスクランナーとして使用します。

5.2. ソースコードのクローン

プロジェクト開発を含める新しいディレクトリーを作成します。

mkdir helloworld
cd helloworld

fhc projects clone <project-guid> を使用してプロジェクト内の全アプリのソースコードをクローンします。以下に例を示します。

fhc projects clone XME5iUr2VoBV3DbXrVF7qApG  # <== Replace this projectId with your projectId

以下のような出力メッセージが表示されます。

Cloning into 'helloWorld-Hello-World-Cloud-App'...

Cloning into 'helloWorld-Hello-World-Client'...

完了したら、作成された新しいディレクトリーを確認します。

ls

helloWorld-Hello-World-Client   helloWorld-Hello-World-Cloud-App

5.3. 別の Git リポジトリーからコードを使用する

https://github.com/evanshortiss/rhmap-express-template などのリモートのリポジトリーからコードを使用するには、以下の手順を実行します。

  1. blank_advanced_webapp といった空白のアプリを作成します。
  2. 使用するリポジトリーを一時ディレクトリーにクローンします。

    git clone git@github.com:evanshortiss/rhmap-express-template.git temp_express
  3. .git ディレクトリーを削除します。

    cd temp_express
    rm -rf .git
  4. 以下のように、リポジトリーのコンテンツをアプリリポジトリーにコピーします。

    cd temp_express
    cp -r * <repo-path>
    cd <repo-path>

これでアプリを開発してその結果を RHMAP にプッシュすることができます。

5.4. 開発中のクラウドアプリへのアクセス

クラウドアプリにアクセスするには以下の 2 つの方法があります。

  1. Platform 上の環境で実行中のクラウドインスタンスにアクセスする。
  2. Node.js のローカルインスタンスでクラウドアプリを実行してアクセスする。

5.4.1. クラウドランタイムの使用

クラウドアプリはデフォルトで http://localhost:8001 を参照します。

クラウドアプリをホストしている URL を調べます。

fhc app hosts --app=<app-guid> --env=<some-env>

応答は以下のようになります。

{
  "url": "https://testing-3utxgzhawprfqot3tya04v5i-example.feedhenry.com"
}

クラウドアプリに属する Gruntfile.js ファイルで変数 default_local_server_url を見つけます。default_local_server_url 変数を、fhc app hosts コマンドで返された値に設定します。

ローカルで実行されているクライアントアプリによって、Platform で実行中のクラウドアプリに要求がルーティングされます。

5.4.2. ローカルランタイムの使用

注記

grunt serve を実行するには、npm のバージョンが 1.4.15 以上である必要があります。

クラウドサーバーコードをローカルで実行します。

cd <PROJECT-DIR>/helloWorld-Hello-World-Cloud-App

クラウドアプリ向けのすべての依存関係をインストールします。

npm install

完了したら (数分かかることがあります)、Node.js サーバーを起動します。

grunt serve

以下のような出力メッセージが表示されます。

Running "env:local" (env) task

Running "concurrent:serve" (concurrent) task
Running "watch" task
Waiting...
Running "nodemon:dev" (nodemon) task
[nodemon] v1.0.20
[nodemon] to restart at any time, enter `rs`
[nodemon] watching: *.*
[nodemon] starting `node application.js`
App started at: Tue Sep 30 2014 15:39:07 GMT+0100 (IST) on port: 8001

Node.js プロセスにより、ターミナルウィンドウでロックがかかります。クラウドサーバーは実行中ですが、作業を進めるために、別のターミナルウィンドウを開き、クラウドサーバーが実行中であることを確認します。

curl -X POST http://localhost:8001/hello?hello=world

以下のような出力メッセージが表示されます。

{"msg":"Hello world"}

入力パラメーターを world から別の値に変更し、更新された応答を確認します。

Gruntfile.js ファイルには、以下のような複数の有用なコマンドが含まれます。

grunt serve     #  'live reload' でサーバーをローカル実行
grunt test      # ローカルでテストを実行
grunt coverage  # コードカバレッジでテストを実行

詳細については、Grunt-ReadMe.md ファイルを参照するか、grunt --help を実行してください。

5.5. クライアントをローカルで実行する

クライアントアプリをローカルで実行します。

cd <PROJECT-DIR>/helloWorld-Hello-World-Client

クライアントアプリ向けのすべての依存関係 (主に grunt 関連) をインストールします。

npm install

Web ブラウザーセッションを開始します。

grunt serve:local

grunt serve:local により、デフォルトでポート 8001 でのローカル Node.js クラウドアプリへの接続が試行されます。以下のようなメッセージが表示されます。

Running "serve:local" (serve) task

Running "clean:server" (clean) task

Running "connect:livereload" (connect) task
Started connect web server on http://localhost:9002

Running "watch" task
Waiting...

詳細については、'Hello World Client' テンプレートアプリ向けの README.md を参照してください。

5.6. ローカルでの MBaaS サービスの作業

MBaaS サービスは Node.js アプリケーションです。MBaaS サービスは、Oracle 統合サービスのようなバックエンドシステムと統合するためにプロジェクトで使用できます。MBaaS サービスは 1 つ以上のプロジェクトと関連付けてアプリで利用できるようにする必要があります。そのようにしないと、プロジェクト内のアプリは MBaaS サービスにアクセスできません。MBaaS サービスの詳細については、relevant product documentation を参照してください。

サービスは、クラウドアプリから $fh.service クラウド API コールで呼び出されます。以下に例を示します。

$fh.service({
  guid: "PFi1ftKRBvlp-qSmgdcOeGe3",
  path: "/hello",
  method: "GET",
  params: {
    "hello": "world"
  }
}, function(err, data) {
  if (err) {
    return console.log(err);
  }
  return console.log(data);
});

ローカル開発環境から MBaaS サービスと対話するには、以下の間でマッピングが必要です。

  1. サービス guid (つまり、サービスの一意な id)
  2. ターゲットとなるサービスの実行中インスタンスのホスト名

Gruntfile.js での新しい環境変数の定義が必要です。

env : {
  options : {},
  // environment variables - see https://github.com/jsoverson/grunt-env for more information
  local: {
    FH_USE_LOCAL_DB: true,
    FH_SERVICE_MAP: function() {
      /*
       * ローカル開発用のサービスのマッピングをここで定義します。
       * アクセスしたい各サービスでマッピングを提供する必要があります。
       * これは、ローカルで実行中のサービスのインスタンスとする (ローカル開発用)
       * もしくはリモートインスタンスとすることができます。
       */
      var serviceMap = {
        'PFi1ftKRBvlp-qSmgdcOeGe3': 'http://127.0.0.1:8010'
      };
      return JSON.stringify(serviceMap);
    }
  }
},

上記の例では、FH_SERVICE_MAP がローカル環境変数の定義に追加されます。新しい変数は関数に対してマップされ、ポート 8010 でローカルで実行中のサービスを参照する GUID PFi1ftKRBvlp-qSmgdcOeGe3 を格納します。サービスのホスト済みインスタンスをターゲットにするには、Studio の Details ページにあるサービスの Current Host URL を使用してください。すべての追加サービスは serviceMap 変数に追加されます。

注記

FH_SERVICE_MAP 環境変数は、単純な文字列ではなく関数として定義されます。

ユーザーは、文字列化された JSON オブジェクトではなく標準的な JSON オブジェクトとしてサービスマッピングを定義できます。以下の例では、FH_SERVICE_MAP 環境変数は標準的な JSON オブジェクトを使用して設定されます。

FH_SERVICE_MAP: '{"PFi1ftKRBvlp-qSmgdcOeGe3":"http://127.0.0.1:8010"}'

利用可能なサンプルは、ここで確認できます。

5.7. クラウドコードの編集

注記

Node.js クラウド API サーバーが’実行されている場合は、grunt がすべての変更を監視します。grunt はリアルタイムで変更を反映します。

クラウドアプリのディレクトリーに移動し、./lib/hello.js を開きます。

応答で現在の時間を設定するパラメーターを追加するには、新しいパラメーターを GET と POST の両方の要求に入力します。

res.json({msg: 'Hello ' + world});

上記の内容を以下の内容に置き換えます。

res.json({msg: 'Hello ' + world, 'timestamp': new Date().getTime() });

これで応答にミリ秒単位の現在の時間がタイムスタンプに追加されます。これが 2 つあるのは、GET および POST リクエストの両方用にルートハンドラーがあるためです。

このファイルが保存されると、クラウドアプリは自動的に再起動します。ファイルの保存後に、以前実行した curl コマンドを再実行します。

curl -X POST http://localhost:8001/hello?hello=world

応答にタイムスタンプが含まれるようになります。

{"msg":"Hello World","timestamp":1412111429480}

5.8. クライアントコードの編集

クライアントアプリのディレクトリーに移動し、./www/index.html を開きます。これは、"name" 用の入力フィールドとクラウドを呼び出すボタンがある基本的な Web ページです。また、クラウドコールから応答に値を入力するために使用する cloudResponse div もあります。

コード "cloudResponse" の直下:

<div id="cloudResponse"></div>

timestamp div の追加:

<div id="timestamp"></div>

./www/hello.js で、クリックハンドラーは "Say Hello" ボタンに割り当てられます。トリガーされると、$fh.cloud API を使用してクラウドアプリの /hello エンドポイントが呼び出されます。

タイムスタンプを提供するには、./www/hello.js を開き、

document.getElementById('cloudResponse').innerHTML = "<p>" + res.msg + "</p>";

上記のコードの直下に以下のコードを追加します。

document.getElementById('timestamp').innerHTML = "<p>" + new Date(res.timestamp) + "</p>";
注記

値を表示するために、クラウドから返されたタイムスタンプ値を受け入れる新しい日付オブジェクトが作成されます。

5.9. App Studio での変更の確認

クライアントディレクトリーとクラウドディレクトリーで以下のコマンドを実行します。

git commit -am"Add timestamp parameter"
git push origin master

これで、ローカルで行われた変更が App Studio に表示されるようになります。

5.10. 高度な開発

fh.db()fh.cache() といった MBaaS API を使用した高度な開発には、別のソフトウェアが必要です。

5.10.1. fh.cache の使用

fh.cache を使用してローカルで開発するには、Redis をローカルでインストールします。

  • RHEL / Fedora: Redis Download Page を参照してください。
  • Debian ベースのディストリビューション: apt-get install redis-server
  • Mac: brew install redis または sudo port install redis
  • Windows: MSOpenTech Redis を参照してください。

Redis がインストールおよび実行されると、クラウドサーバーの fh.cache への呼び出しは RHMAP クラウドの場合と同様に動作します。

重要

デフォルトの Redis ポートが使用されるため、Redis 設定ファイルを変更する必要はありません。

5.10.2. fh.db の使用

fh.db を使用してローカルで開発するには、Mongo をローカルでインストールします。

  • RHEL / Fedora: こちら (英語) の手順を実行します。
  • Debian ベースのディストリビューション: こちら (英語) の手順を実行します。
  • Mac: こちら (英語) の手順を実行する、または brew install mongodb
  • Windows: こちら (英語) の手順を実行します。

インストールされて実行されると、クラウドサーバーの fh.db への呼び出しは RHMAP クラウドの場合と同様に動作します。

重要

デフォルトの Mongo ポートが使用されるため、Mongo 設定ファイルを変更する必要はありません。

5.11. 次のステップ