依存関係を正しくする
目的
モジュールとモデルは通常、さまざまな型の依存関係のネットワークによって相互接続されています。MPS プロジェクト構造のページに従って、モジュールとモデルの基本的な原則と分類を理解していると仮定すると、私達は今やすべての詳細を学ぶようにさらに深く掘り下げることができます。
MPS で依存関係を正しく取得することは、経験の浅いユーザーやベテランのベテランの間でもフラストレーションの頻繁な原因です。このページは、問題を一度に解決することを目的としています。さまざまなモジュールと依存関係の種類によってセクションに分類されたすべての関連情報を見つけることができるはずです。
すべてのプログラミング言語には「インポート」という概念があります。Java では、パッケージと "import" 文を受け取ります。Ruby または Python には、「modules」と「require」または「import」ステートメントがあります。MPS では、コードをパッケージ化し、言語間で普遍的に機能する方法で依存関係を表現するための同様のメカニズムを提供します。コードはモデルへのパッケージであり、これらのモデルは相互依存関係を表現できます。
さらに、MPS は多言語開発環境であるため、モデルはモデルで有効になっている言語(別名構文)を指定できます。これは、Java、Ruby、その他の言語でコードを作成する場合とは異なります。この場合、使用する言語は規則(ファイル拡張子など)によって指定および修正されます。
便利なキーボードショートカット
左側のプロジェクトツールウィンドウのモデルやノードに配置されているとき、またはエディターで編集しているときはいつでも、キーボードを使用して、依存関係や使用言語を現在のモデルとそれを含むソリューションに追加するクイックアクションを呼び出すことができます。
Ctrl+L - 使用言語を追加
Ctrl+M - 依存関係を追加する
Ctrl+R - 与えられた名前の根本的な概念を含む依存関係を追加する
Ctrl+Shift+A - 一般的なアクション選択ダイアログが表示され、現在のコンテキストに適用できる目的のアクションを選択できます。
ソリューション
ソリューションは、1 つ以上の言語で書かれたプログラムを表します。通常、これらは次の 4 つの目的に役立ちます。
通常のソリューション - これらのソリューションはエンドユーザーコードを保持します。通常、IDE はオンデマンドでコードを生成し、生成された Java コードをコンパイルします。コンパイルされたコードは IDE にはロードされませんが、別の Java プロセスでオンデマンドで実行できます。
サンドボックスソリューション - これらのソリューションは主に、言語設計のプロセス中に言語設計者によって、言語を対話的に進化させるためにコードを操作するために使用されます。通常、IDE はコードを生成しますが、生成されたコードをコンパイルしようとはしません。
ランタイム ソリューション - これらのソリューションには、他のモジュール (ソリューション、言語、ジェネレーター) が依存するコードが含まれています。コードは、MPS モデルだけでなく、Java クラス、ソース、jar ファイルでも構成できます。IDE はコードを生成してコンパイルし、クラスが外部でコンパイルまたは変更されるたびにクラスを再ロードします。
プラグインソリューション - これらのソリューションは、何らかの方法で IDE の機能を拡張します。新しいメニューエントリを提供したり、サイドツールパネルウィンドウを追加したり、プロジェクト設定ダイアログからカスタム設定画面を定義したりできます。ここでも、MPS はコードを生成してコンパイルし、クラスが変更されるたびにクラスを再ロードし続けます。さらに、IDE 機能もそれに応じて更新されます。
すべてのソリューションに有効なプロパティから始めて、次にサンドボックス、ランタイム、プラグインソリューションの詳細について説明します。
共通
Properties
名前 - ソリューションの名前
ファイルパス - モジュールファイルのパス
ジェネレーター出力パス - 生成されたソースが置かれるべきフォルダーを指します
モジュールバージョン - モジュールの内部バージョン番号。ユーザーは直接変更しないでください
左側パネル - モデルのルートが含まれています。各モデルのルートには 1 つ以上のモデルが含まれています。
右側パネル - 左側のパネルで現在選択されているモデルルートの下のディレクトリ構造を表示します。フォルダーと jar ファイルを選択して、現在のモデルルートのモデルとしてマーク / マーク解除することができます。
モデルルート型
ソリューションにはモデルルートが含まれており、モデルルートにはモデルが含まれています。各モデルルートは通常フォルダーを指し、含まれているモデルはそのフォルダーの 1 つ以上のサブフォルダーにあります。含まれているモデルの種類に応じて、モデルルートはさまざまな種類のものになります。
デフォルト - MPS モデルを保持する標準 MPS モデルルート型
java_classes - Java クラスファイルを含む一連のディレクトリまたは jar ファイル
javasource_stubs - Java ソースを含む一連のディレクトリまたは jar ファイル
依存関係
ソリューションの依存関係は他のソリューションや言語であり、そのモデルはこのソリューション内から見ることができます。
エクスポートフラグは、依存関係を現在のソリューションに依存するすべてのモジュールへの依存関係として推移的に追加するかどうかを指定します。例: モジュール A はエクスポートオンで B に依存し、C は A に依存し、C は B に依存します。
使用言語
ソリューションのモデルが使用する可能性のある言語と開発キットは、使用される言語の中にリストされています。使用言語はモデルレベルで指定され、モジュールの使用言語タブには、すべてのモデルの使用言語のコレクションのみが表示されます。
Java
これが、さまざまな種類のソリューションの大部分が異なる場所です。
「Java」タブには、言語機能のレベルとコンパイルおよびクラスロードのプロセスをカスタマイズするためのいくつかのオプションが含まれています。これらのオプションの一部は、左側の小さな矢印アイコンをクリックして「詳細」設定の領域を展開した場合にのみ表示されます。
これらの設定のすべての組み合わせが意味をなすわけではないため、選択した他のオプションと無関係な視覚要素は UI でグレー表示されます。
言語レベル - ソリューションでサポートする必要がある java 言語機能を指定します。
Compilation - モジュールから生成された Java コードをコンパイルするために使用するコンパイラーを指定します。
with MPS - 生成されたアーティファクトを、生成プロセスの一部として MPS で Java コンパイラーを使用して直接コンパイルする必要があるかどうかを示します。
外部コンパイラー - 外部コンパイラーを使用します。MPS はコンパイルに関与しません。外部コンパイラーがコンパイルを処理することを前提としていますが、コンパイルプロセスの実行を強制しません。例: コンパイルされたクラスを含む java ライブラリの場合、コンパイルプロセスはありません。ここでの「外部」オプションは、MPS が MPS 自体とは無関係にコンパイルが行われることを期待していることを意味します。
外部の IDEA コンパイルを要求する - (MPS 開発者による内部使用用) コンパイルには IntelliJ IDEA を使用します。このオプションは MPS 自体の開発にのみ役立ち、機能するには追加のプラグインが必要です。このオプションを表示するには、-Dmps.internal=true vm オプションを有効にする必要があります。
なし - コンパイルは行われません。MPS は、このモジュールにクラスが含まれていないと想定しているため、クラスパスにモジュールのコンテンツを含めません。
コンパイラーの出力パス - コンパイルされたコードを保存するフォルダーを指定します。
クラスローダー - コンパイルされたクラスをロードする方法を指定します。
MPS - これは、JavaModuleFacet で利用可能な情報 (つまり、出力クラスの場所と java ライブラリ + 他の MPS モジュールへの依存関係) に基づいてモジュールのクラスパスを管理するように MPS に指示します。さまざまなコントリビュータからのモジュールは、親クラスローダとしてコントリビュータのクラスパスを持ち、プラグインライブラリなどにアクセスできます (プラグインコントリビュータの場合)。以下の「モジュールコントリビュータ」オプションとの違いは、MPS によるクラスロードの場合、MPS はモジュールクラスローダ (classes_gen + モジュールの依存関係 + 親クラスパスを考慮する) を作成するのに対し、「モジュールコントリビュータ」の場合はコントリビュータのクラスパスのみに依存することです (つまり、MPS は使用しません)。依存関係または classes_gen)。
モジュールコントリビューター - モジュールを提供したコードが、モジュールクラスのクラスローダの提供も担当することを示します。最も一般的なコントリビューターは、アプリ / プロジェクトライブラリとプラグインです。例: プラグインのコントリビューターは、実際の MPS モジュールクラスに加えて、プラグインクラス (plugin-home/lib/* にあるもの) を追加するクラスローダーを提供します。
なし - クラスをロードしません。
MPS の拡張に貢献 - コンパイルされたクラスをその拡張 (アクション、メニューなど) として MPS にロードする必要があるかどうかを示します。これは主に、コードを IDEA または別のプラグインと統合する必要がある場合、つまり、一部のクラスが同じクラスパスから来るものとして IDEA と MPS の両方に表示される必要がある場合に使用されます。
ソースパス - プロジェクト内の他の Java コードで使用できるようにする必要がある Java ソース。つまり、生成されたソースとともにモジュールのコンパイルに含める必要があります。
ライブラリ - コンパイル時と実行時にクラスパスに含める必要がある Java クラスと jar。
ファセット
カスタム生成 - ジェネレータープランをモジュールにアタッチできます。明示的なジェネレーター計画の詳細については、ジェネレーター計画のドキュメントを参照してください。
Java- ソリューションが何らかの方法で Java に依存しているかどうかを確認しました。ほとんどの場合、これをチェックしておいてください。
テスト - ソリューションにテストモデルが含まれている場合にチェックされます
ソリューションモデル
ソリューションには 1 つ以上のモデルが含まれています。たとえば Java パッケージのように、モデルを相互に入れ子にして階層を形成することができます。プロパティダイアログは微調整できるいくつかの設定オプションを隠します。
依存関係
現在のモジュールまたはインポートされたモジュールのモデルをここにリストすることができるため、それらの要素はこのモデルのコードでアクセス可能になります。
使用言語
このモデルで使用される言語はここにリストされていなければなりません。
拡張
いくつかの追加オプションが詳細設定タブに一覧表示されます。
生成しない - このモデルをコード生成から除外します。おそらくそれは意味のある生成ができないからです
ファイルパス - モデルファイルの場所
世代に関わる言語 - モデルの適切な生成に必要な言語をリストします。言語が直接的または間接的に使用される言語のいずれとも関連付けられていないため、ジェネレーターがこれらの言語を自動的に見つけられない場合
仮想パッケージ
モデル内のノードは、仮想パッケージの階層に論理的に編成できます。ノードのコンテキストポップアップメニューから仮想パッケージの設定オプションを使用して名前を指定し、ネストされた仮想フォルダー名をドット記号で区切ることができます。
プロジェクトへの外部 Java クラスと jar の追加 - ランタイムソリューション
ランタイムソリューションは、MPS の再利用可能なコードのライブラリを表します。これらには、MPS コードを保持するモデルと、外部 Java ソース、クラス、jar ファイルを参照するスタブモデルが含まれる場合があります。プロジェクトに外部 Java コードを適切に含めるには、いくつかの手順に従う必要があります。
プロジェクトに新しいソリューションを作成します。
必要な jar ファイル、クラス、Java ソースを、ソリューションのルートフォルダーのディレクトリ (「/libs」など) にコピーします。
ソリューションのプロパティダイアログ(Alt+Enter)で、Java コードを添付します。これにはいくつかの手順が必要です。
まず、モデルルート(モジュールに属するモデルの場所)を管理するための「共通」タブの左側のパネルで、MPS で書いたコードをランタイムライブラリの一部として保存または作成したい場合を除き、既存のモデルルートを削除します。
次に、同じく「共通」タブで、モデルルートの追加をクリックし、目的の型のファイルを選択します。
Java クラス - クラスまたは jar 用
Java ソース - Java ソース用
Kotlin Common - Kotlin/Common ライブラリ用
Kotlin JVM - コンパイルされた Kotlin/JVM ライブラリ用
次に、MPS を lib フォルダー (jar ファイルを含むフォルダー、または Java クラスまたはソースのパッケージ階層のルートを含むフォルダー) に移動します。これにより、モデルルートのリストに新しいエントリが追加されます。このエントリは「libs」フォルダーを表します。
3 番目に、左側のサイドパネルで新しいモデルのルートが選択されたら、プロパティダイアログの右側のサイドパネルにリストされているフォルダー(複数可)または jar(複数可)を選択し、右側のサイドパネルの上部にある青い " ソース " ボタンをクリックします。選択されたフォルダーと jar は、右側のサイドパネルに青いアイコンで表示されます。
依存関係タブに切り替えて、JDK ソリューションを依存関係として追加します。エクスポートフラグをオンにすることを忘れないでください。これにより、jar ファイルが JDK クラスを参照できるようになります。
次に、Java タブに移動して、すべての jar またはクラスのルートフォルダーをウィンドウのライブラリ部分に追加します。そうしないと、ライブラリクラスを使用するソリューションをコンパイルできません。java_sourcestubs を使用する場合は、代わりに Java タブウィンドウのソースパス部分にソースを追加してください。また、モジュールに追加したライブラリの依存関係も追加します。
さらに、引き続き Java> タブで、MPS 拡張ラベルのコントリビュートなしで通常の MPS モジュールの背後に隠れているパネルを展開し、MPS の拡張に貢献オプションをはいに設定して、MPS がクラスを適切に再ロードできるようにします。
スタブという名前の新しいフォルダーがソリューションに表示されます
.
これで、ソリューションを別のモジュール(ソリューション、言語、ジェネレーター)にインポートすると、そのモジュールのモデルでクラスが使用できるようになります。
言語のジェネレーターによって生成されるコードのランタイム依存関係としてランタイムソリューションを使用する言語は、モジュールプロパティのランタイムタブのランタイムソリューションセクションでそれを参照する必要があります。
ビルドモデルにランタイム jar を含める -MPS ビルドスクリプトを使用して言語でプラグインをビルドする場合は、ターゲットレイアウト定義内の目的の場所にランタイムライブラリをコピーして、プラグインにパッケージ化する必要もあります。
これを忘れると、ビルドスクリプトのモデルを再構築するときに「ローカルレイアウトにそのようなパスはありません」などのエラーが表示されます。
ランタイムソリューションがプロジェクトフォルダーの外にあるライブラリを使用する場合、ビルドスクリプトはフォルダーマクロを使用してライブラリへのパスを指定する必要があります。
言語
言語は言語定義を表し、それぞれが言語の異なる側面を表す複数のモデルで構成されます。言語には 1 つ以上の生成プログラムモジュールが含まれる場合があります。言語のプロパティダイアログは、多くの点でソリューションのダイアログに似ています。以下では相違点のみを説明します。
共通
言語には通常、ディレクトリを指す単一のモデルルートがあり、そこには異なる側面のすべてのモデルが配置されています。
名前 - 言語の名前
ファイルパス - モジュールファイルのパス
ジェネレーター出力パス - 生成されたソースが置かれるべきフォルダーを指します
言語バージョン - 言語で新しい移行が作成されるたびに増加する言語のバージョンを表す番号。この番号はユーザーが直接変更しないでください
モジュールバージョン - モジュールの内部バージョン番号。ユーザーは直接変更しないでください
左側パネル - モデルのルートが含まれています。各モデルのルートには 1 つ以上のモデルが含まれています。
右側パネル - 左側のパネルで現在選択されているモデルルートの下のディレクトリ構造を表示します。フォルダーと jar ファイルを選択して、現在のモデルルートのモデルとしてマーク / マーク解除することができます。
依存関係
言語の依存関係は他のソリューションや言語であり、そのモデルはこのソリューションの中から見ることができます。エクスポートフラグは、現在の言語に依存するすべてのモジュールへの依存関係として、依存関係を他動的に追加するかどうかを指定します。
言語への依存はあなたにスコープオプションを提供します:
デフォルト - 他の言語 / ソリューションのモデルのみを参照できるようにします (集約)
構造の側面は、集約によって組み込まれるマニフェスト言語(つまり、子のロールで外国の概念を使用する)であり、集約言語を使用するモデルにそのような言語を明示的にインポートしたり、言語モジュールを「拡張」したりする必要はありません。
拡張 - 言語がそこの言語から概念を拡張する概念を定義できるようにします
生成ターゲット - 現在の言語が他の言語に生成されることを指定します。他の言語は現在の言語の生成が終了した後にのみ生成される必要があるというジェネレーター順序付け制約を設定します。
使用言語
これは解決策と同じです。
ランタイム
ランタイムソリューション - 言語に必要な再利用可能なコードのソリューションをリストします。このようなソリューションの作成の詳細については、「プロジェクトへの外部 Java クラスおよび jar の追加 - ランタイムソリューション」セクションを参照してください。
アクセサーリーモデル - 言語に必要なアクセサーリモデルを一覧表示します。これらのアクセサーリモデルに含まれるノードは、Java クラスパスおよびこの言語を使用するすべてのモデルの依存関係で暗黙的に使用できます。
Java
ソースパス - プロジェクト内の他の Java コードで使用できるようにする必要がある Java ソース。つまり、生成されたソースとともにモジュールのコンパイルに含める必要があります。
ライブラリ - コンパイル時と実行時にクラスパスに含める必要がある Java クラスと jar。
ファセット
これは解決策と同じです。
言語モデル / 側面
依存関係 / 使用言語 / 上級
ソリューションのセクションに従って、これらの設定は同じであり、他のモデルの設定と同じ意味を持ちます。
生成プログラム
ジェネレーターモジュールの設定は他のモジュール型の設定と非常によく似ています。
共通
名前 - ジェネレーターモジュールの名前
ファイルパス - モジュールファイルのパス
エイリアス - UI 内のジェネレーターを表す論理名。通常、名前にはかなり長い値が含まれます。
左側パネル - モデルのルートが含まれています。各モデルのルートには 1 つ以上のモデルが含まれています。
右側パネル - 左側のパネルで現在選択されているモデルルートの下のディレクトリ構造を表示します。フォルダーと jar ファイルを選択して、現在のモデルルートのモデルとしてマーク / マーク解除することができます。
依存関係
これは解決策と同じです。さらにジェネレーターモジュールは他のジェネレーターモジュールに依存してスコープを指定するかもしれません:
デフォルト - 他の言語 / ソリューションのモデルのみを参照できるようにします
拡張 - 現在のジェネレーターは、拡張ジェネレーターのジェネレーター要素を拡張できるようになります
設計 - ターゲットジェネレーターは、このジェネレーターの優先ルールから参照する必要があるだけです
使用言語
これは言語の場合と同じです。
ジェネレーターの優先順位
このタブでは、生成プロセスでジェネレーターを適切に順序付けるために、ジェネレーターの優先順位規則を定義できます。さらに、ダイアログ下部のチェックボックスで 3 つのオプションを設定できます。
テンプレートを生成する - ジェネレーターテンプレートを生成して Java にコンパイルするかどうか、あるいは生成時にジェネレーターによって代わりに解釈されるかどうかを示します。
Java
ソースパス - プロジェクト内の他の Java コードで使用できるようにする必要がある Java ソース。つまり、生成されたソースとともにモジュールのコンパイルに含める必要があります。
ライブラリ - コンパイル時と実行時にクラスパスに含める必要がある Java クラスと jar。
ファセット
これは言語の場合と同じです。
ジェネレーターモデル
これは解決策と同じです。
関連ページ:
MPS プロジェクト構造
言語を設計したりコードを書いたりするときには、優れた構造を使用して各部分を移動したり、組み合わせたりすることができます。MPS はこの点で他の IDE と似ています。プロジェクト:プロジェクトは MPS の主な組織単位です。プロジェクトは 1 つ以上のモジュールで構成されており、それら自体がモデルで構成されています。モデルは生成 / コンパイルの最小単位です。以下でこれらの概念を詳細に説明します。モデル:MPS がもたらす大きな違いは次のとおりです。プログラムはテキスト形式ではありません。プ...
世代計画
世代計画:生成計画を使用すると、開発者は自分のモデルに望ましい生成順序を明示的に指定でき、生成プロセスをより適切に制御できます。目的相互ジェネレーターの優先順位の指定は、大規模なプロジェクトの場合には面倒になる可能性があります。さらに、優先順位を指定するために、関係する言語は、適切な相互依存関係を宣言することによって互いのことを知る必要があります。これにより、言語の (場合によっては望ましい) 独立性が損なわれます。生成計画では、生成ステップの適切な順序付けの責任が 1 か所 (生成計画) に...
依存関係アナライザー
依存関係アナライザーは、モジュールまたはモデル間の依存関係をレポートできます。メインメニューまたはモジュール / モデルのポップアップメニューから呼び出すことができます。下部のパネルに表示される対話型レポートでは、他のモジュール、モデル、ノード別に、モジュール、モデル、ノードの使用状況を表示できます。右側のパネルには、左側のリストで選択した要素が依存しているモジュールとモデルが表示されます。下部パネルには、現在選択されている依存関係を必要とする実際の場所が一覧表示されます。L アイコンを使用すると...