MPS 2020.1 ヘルプ

依存関係を正しくする

目的

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

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

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

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

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

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

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

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

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

  • Ctrl+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

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

ファセット

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

ジェネレーターモデル

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

最終更新日 : 2020 年 6 月 18 日