MPS 2019.1ヘルプ

依存関係を正しくする

目的

モジュールとモデルは通常、さまざまなタイプの依存関係のネットワークによって相互接続されています。MPSプロジェクト構造のページに従って、モジュールとモデルの基本的な原則と分類を理解していると仮定すると、私達は今やすべての詳細を学ぶようにさらに深く掘り下げることができます。

MPSで依存関係を正しく取得することは、経験の浅いユーザーやベテランのベテランの間でもフラストレーションの頻繁な原因です。このページは、問題を一度に解決することを目的としています。さまざまなモジュールと依存関係の種類によってセクションに分類されたすべての関連情報を見つけることができるはずです。

すべてのプログラミング言語には「インポート」という概念があります。Javaでは、パッケージと "import"文を受け取ります。RubyまたはPythonには、「modules」と「require」または「import」ステートメントがあります。MPSでは、コードをパッケージ化し、言語間で普遍的に機能する方法で依存関係を表現するための同様のメカニズムを提供します。コードはモデルへのパッケージであり、これらのモデルは相互依存関係を表現できます。

さらに、MPSは多言語開発環境であるため、モデルではそれらで有効になっている言語(別名構文)を指定できます。これは、使用する言語が指定されて固定されている、Java、Ruby、またはその他の言語でコードを書く場合とは異なります。

便利なキーボードショートカット

左側のプロジェクトツールウィンドウモデルノードに配置されているとき、またはエディターで編集しているときはいつでも、キーボードを使用して、依存関係や使用言語を現在のモデルとそれを含むソリューションに追加するクイックアクションを呼び出すことができます。

  • Control + L - 使用言語を追加

  • Control + M - 依存関係を追加する

  • Control/Cmd + R - 与えられた名前の根本的な概念を含む依存関係を追加する

  • Control/Cmd + Shift + A - 一般的なアクション選択ダイアログが表示されます。ここでは、現在のコンテキストに適用可能な目的のアクションを選択できます。

ソリューション

ソリューションは、1つ以上の言語で書かれたプログラムを表します。それらは通常2つの目的を果たします。

  1. サンドボックスソリューション - これらのソリューションにはエンドユーザーコードが含まれています。IDEはコードを特別な方法で処理しません。

  2. ランタイム ソリューション - これらのソリューションには、他のモジュール(ソリューション、言語、またはジェネレータ)が依存するコードが含まれています。コードはMPSモデルとJavaクラス、ソースまたはjarファイルで構成できます。IDEは、クラスがコンパイルまたは外部で変更されるたびに、クラスをリロードします。

  3. プラグインソリューション - これらのソリューションは何らかの方法でIDE機能を拡張します。それらは新しいメニューエントリを提供したり、サイドツールパネルウィンドウを追加したり、プロジェクト設定ダイアログなどからカスタム設定画面を定義したりすることができます。繰り返しますが、MPSはクラスが変更されるたびにリロードし続けます。さらに、IDE機能もそれに応じて更新されます。

すべてのソリューションに有効なプロパティーから始めて、ランタイムおよびプラグインソリューションの詳細について説明します。

Solution1

共通

プロパティー

  • 名前 - ソリューションの名前

  • ファイル・パス - モジュールファイルのパス

  • ジェネレーター出力パス - 生成されたソースが置かれるべきフォルダーを指する

  • 左側パネル - モデルのルートが含まれています。各モデルのルートには1つ以上のモデルが含まれています。

  • 右側パネル - 左側のパネルで現在選択されているモデルルートの下のディレクトリー構造を表示します。フォルダーとjarファイルを選択して、現在のモデルルートモデルとしてマーク/マーク解除することができます。

モデルルートタイプ

ソリューションにはモデルルートが含まれており、モデルルートにはモデルが含まれています。各モデルルートは通常フォルダーを指し、含まれているモデルはそのフォルダーの1つ以上のサブフォルダーにあります。含まれているモデルの種類に応じて、モデルルートはさまざまな種類のものになります。

  • デフォルト - MPSモデルを保持する標準MPSモデルルートタイプ

  • java_classes - Javaクラスファイルを含む一連のディレクトリーまたはjarファイル

  • javasource_stubs - Javaソースを含む一連のディレクトリーまたはjarファイル

依存関係

ソリューションの依存関係は他のソリューションや言語であり、そのモデルはこのソリューション内から見ることができます。

エクスポートフラグは、依存関係を現在のソリューションに依存するすべてのモジュールへの依存関係として推移的に追加するかどうかを指定します。ex:モジュールAはエクスポートオンでBに依存し、CはAに依存し、CはBに依存します。

使用言語

ソリューションのモデルが使用する可能性のある言語とdevkitsは、使用される言語の中にリストされています。使用言語はモデルレベルで指定され、モジュールの使用言語タブにはその全モデルの使用言語のコレクションのみが表示されます。

Java

これが、さまざまな種類のソリューションの大部分が異なる場所です。

Javaタブにはいくつかのオプションがあります。

  • ソリューションの種類 - 異なる種類のソリューションはMPSによってわずかに異なる方法で処理され、異なるMPS内部構造にアクセスできます。
    • なし - デフォルト。ユーザーコードに使用されます。特別なクラスローディング方法は必要ありません - サンドボックスソリューションに使用

    • その他 - 他の言語やソリューションによって利用されている再利用可能なコードの典型的なライブラリーによって使用されます - ランタイムソリューションに使用

    • コアプラグイン - MPS IDEコアに結び付き、それに従ってクラスローディングを管理する必要があるコードによって使用されます。- プラグインソリューションに使用

    • エディタープラグインは、MPSエディターに結び付けられ、そのクラスローディングを他のエディターと同期して管理する必要があるコードで使用されます。プラグインソリューションの場合は、エディターを強化するだけです。

  • MPSでコンパイル - 生成された成果物をMPSおよび生成プロセスの一部で直接Javaコンパイラーでコンパイルする必要があるかどうかを示します

  • ソース・パス - プロジェクト内の他のJavaコードで使用可能にする必要があるJavaソース

  • ライブラリー - 実行時に1つ以上のモデルのソリューション内のJavaコードによって必要とされるJavaクラスおよびjar

ファセット

  • アイデアプラグイン - 解決策がIDE機能にフックする場合はチェック

  • Java - 解決策が何らかの方法でJavaに依存している場合はチェックします。ほとんどの場合、これをチェックしたままにしてください。

  • tests - 解にテストモデルが含まれる場合はチェック

ソリューションモデル

ソリューションには1つ以上のモデルが含まれています。たとえばJavaパッケージのように、モデルを相互に入れ子にして階層を形成することができます。プロパティーダイアログは微調整できるいくつかの設定オプションを隠します。

Model1

依存関係

現在のモジュールまたはインポートされたモジュールのモデルをここにリストすることができるため、それらの要素はこのモデルのコードでアクセス可能になります。

使用言語

このモデルで使用される言語はここにリストされていなければなりません。

拡張

いくつかの追加オプションが詳細設定タブに一覧表示されます。

  • 生成しない - このモデルをコード生成から除外します: おそらくそれは意味のある生成ができないからです

  • ファイル・パス - モデルファイルの場所

  • 世代に関わる言語 - モデルの適切な生成に必要な言語をリストします: 言語が直接的または間接的に使用される言語のいずれとも関連付けられていないため、ジェネレータがこれらの言語を自動的に見つけられない場合

仮想パッケージ

モデル内のノードは、仮想パッケージの階層に論理的に編成できます。ノードのコンテキストポップアップメニューから仮想パッケージの設定オプションを使用し、名前を指定します。ネストした仮想フォルダー名は、ドット記号で区切ることができます。

プロジェクトへの外部Javaクラスとjarの追加 - ランタイムソリューション

ランタイムソリューションはMPSの再利用可能なコードのライブラリーを表します。それらはMPSコードを保持するモデルと外部Javaソース、クラスまたはjarファイルを参照するモデルを含むかもしれません。プロジェクトに外部Javaコードを正しく含めるには、いくつかの手順に従う必要があります。

  1. 新しいソリューションを作成する

  2. ソリューションのプロパティーダイアログ(Alt + Enter)で、次のようにJavaコードを指定します。
    1. 「共通」タブ - モデルルートを追加をクリックして、クラスまたはjarファイルのためのjavaclassesを選択し、Javaのソースの選択javasource_stubsとあなたのlibフォルダーに移動します。

    2. プロパティーダイアログの右側パネルに表示されているフォルダーまたはjarを選択し、青い「モデル」ボタンをクリックしてください。

    3. また、Javaタブ上でウィンドウのライブラリー部分にすべてのjarファイルまたはクラスルートフォルダーを追加します。そうしないと、ライブラリークラスを使用したソリューションではコンパイルできません。java_sourcestubsを使用する場合は、代わりにJavaタブウィンドウのソース・パス部分にソースを追加してください。

  3. スタブという名前の新しいフォルダーがソリューションに表示されます

  4. ソリューションを他のモジュール(ソリューション、言語、ジェネレータ)にインポートした後、クラスはそのモジュールのモデルで利用可能になります

  5. ランタイムソリューションを使用したい言語は、それらのモジュールプロパティーのランタイムタブのランタイムソリューションセクションでそれを参照する必要があります。

言語

言語は言語定義を表し、いくつかのモデルで構成されています。それぞれのモデルは言語の異なる側面を表します。言語には単一の生成プログラムモジュールも含まれています。言語のプロパティーダイアログは多くの点でソリューションのものと似ています。以下では、違いだけにメンションします。

Language1

共通

言語には通常、ディレクトリーを指す単一のモデルルートがあり、そこには異なる側面のすべてのモデルが配置されています。

依存関係

言語の依存関係は他のソリューションや言語であり、そのモデルはこのソリューションの中から見ることができます。エクスポートフラグは、現在の言語に依存するすべてのモジュールへの依存関係として、依存関係を他動的に追加するかどうかを指定します。

言語への依存はあなたにスコープオプションを提供します:

  • デフォルト - 他の言語/ソリューションのモデルのみを参照可能にする(集約)
    構造的な側面が集約によって組み込まれている言語を明示しているため(つまり、子のロールで外部概念を使用しているため)、集約言語を使用するモデルにそのような言語を明示的にインポートしたり、言語モジュールを拡張する必要はありません。

  • 拡張 - 言語がそこの言語から概念を拡張する概念を定義することを可能にする

  • 生成ターゲット - 現在の言語が他の言語に生成されることを指定します。他の言語は現在の言語の生成が終了した後にのみ生成される必要があるというジェネレータ順序付け制約を設定します。

使用言語

これは解決策と同じです。

ランタイム

  • ランタイムソリューション - 言語が必要とする再利用可能なコードの解決策を列挙します。そのようなソリューションを作成する方法の詳細については上記の「プロジェクトへの外部Javaクラスとjarの追加 - ランタイムソリューション」セクションを参照してください。

  • アクセサーリーモデル - 言語が必要とするアクセサーリーモデルをリストします。これらのアクセサーリモデルに含まれるノードは、この言語を使用しているすべてのモデルのJavaクラスパスおよび依存関係で暗黙的に使用可能です。

Java

これは、言語には適用できない2つの欠落オプションを除いて、ソリューションの場合と同じです。

ファセット

これは解決策と同じです。

言語モデル/側面

依存関係/使用言語/上級

ソリューションのセクションに従って、これらの設定は同じであり、他のモデルの設定と同じ意味を持ちます。

生成プログラム

ジェネレータモジュールの設定は他のモジュールタイプの設定と非常によく似ています。

Generator1

共通

これは言語の場合と同じです。

依存関係

これは解決策と同じです: さらにジェネレータモジュールは他のジェネレータモジュールに依存してスコープを指定するかもしれません:

  • デフォルト - 他の言語/ソリューションのモデルのみを参照可能にする

  • 拡張 - 現在のジェネレータは、拡張ジェネレータのジェネレータ要素を拡張することができます。

  • デザイン - ターゲットジェネレータは、このジェネレータの優先順位規則から参照される必要があるだけです。

使用言語

これは言語の場合と同じです。

ジェネレーターの優先順位

このタブでは、生成プロセスでジェネレータを適切に順序付けるために、ジェネレータの優先順位規則を定義できます。さらに、ダイアログ下部のチェックボックスで3つのオプションを設定できます。

  • テンプレートを生成する - ジェネレータテンプレートを生成してJavaにコンパイルするかどうか、あるいは生成時にジェネレータによって代わりに解釈されるかどうかを示します。

  • リフレクションクエリ - 生成されたクエリがJavaリフレクションを通じて呼び出されるかどうかを示します。(詳細はGeneratorのドキュメントを調べましょう)

  • IOperationContextパラメーター - ジェネレータがクエリに渡されたoperationContextパラメータを利用するかどうかを示します。このパラメータは将来削除される予定で、ジェネレータは徐々に使用を停止べきです。

Java

これは言語の場合と同じです。

ファセット

これは言語の場合と同じです。

ジェネレーターモデル

これは解決策と同じです。

最終更新日: 2019年7月5日