MPS 2020.3 ヘルプ

依存関係を正しくする

目的

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

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

All programming languages have a notion of "imports". In Java you get packages and the "import" statement. In Ruby or Python you have "modules" and "require" or "import" statements. In MPS we provide a similar mechanism for packaging code and expressing dependencies in a way that works universally across languages - code is packages into models and these models can express mutual dependencies.

In addtion, since MPS is a multi-language development environment, models can specify the languages (aka syntaxes) enabled in them. This is different from when writing code in Java, Ruby or other languages, where the language to be used is given and fixed by conventions (e.g. the file extension).

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

Whenever positioned on a model or a node in the left-hand-side プロジェクトツールウィンドウ or when editing in the editor, you can invoke quick actions with the keyboard that will add dependencies or used languages into the current model as well as its containing solution.

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

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

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

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

ソリューション

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

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

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

  3. プラグインソリューション - these solutions extend the IDE functionality in some way. They can contribute new menu entries, add side tool panel windows, define custom preference screens fro the Project settings dialog, etc. Again, MPS will keep reloading the classes, whenever they change. Additionally the IDE functionality will be updated accordingly.

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

Solution1

共通

Properties

  • Name - name of the solution

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

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

  • 左側パネル - contains model roots, each of which may hold one or more models.

  • 右側パネル - displays the directory structure under the model root currently selected in the left-side panel. Folders and jar files can be selected and marked/unmarked as being models of the current model root.

モデルルート型

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

  • default- the standard MPS model root type holding MPS models

  • java_classes- a set of directories or jar files containing Java class files

  • javasource_stubs- a set of directories or jar files containing Java sources

依存関係

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

The エクスポート flag then specifies whether the dependency should be transitively added as a dependency to all modules that depend on the current solution. For example, of module A depends on B with export on and C depends on A, then C depends on B.

使用言語

The languages as well as devkits that the solution's models may use are listed among used languages. Used languages are specified on the model level and the Used Languages tab on modules only shows a collection of used languages of its all models.

Java

This is where the different kinds of Solutions differ mostly.

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

  • ソリューションの種類 - 異なる種類のソリューションは MPS によってわずかに異なる方法で処理され、異なる MPS 内部構造にアクセスできます。
    • None - default, used for user code, which does not need any special class-loading strategy - use for サンドボックスソリューション

    • Other - used by typical libraries of reusable code that are being leveraged by other languages and solutions - use for ランタイムソリューション

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

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

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

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

  • Libraries - Java classes and jars that are required at run-time by the Java code in one or more models of the solution

ファセット

  • Custom Generation - allows attaching a generator plan to the module. More on explicit generator plans is to be found at the Generator plans documentation.

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

  • Java - checked, if the solution relies on Java on some way. Keep this checked in most cases.

  • tests - checked, if the solution contains test models

ソリューションモデル

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

Model1

依存関係

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

使用言語

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

詳細

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

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

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

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

仮想パッケージ

Nodes in models can be logically organised into hierarchies of virtual packages. Use the Set Virtual Package option from the node's context pop-up menu and specify a name, possibly separating nested virtual folder names with the dot symbol.

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

Runtime solutions represent libraries of reusable code in MPS. They may contain models holding MPS code as well as stub models that refer to external Java sources, classes or jar files. To properly include external Java code in a project, you need to follow a few steps:

  1. Create a new Solution in your project.

  2. Copy the desired jar files, classes or Java sources into a directory under the solution's root folder, such as "/libs".

  3. In the Solution's properties dialog ( Alt+Enter ) attach the Java code. This requires a few steps:

    Model roots1

    1. First, in the left-hand side panel of the 「共通」タブ , which is used to manage model roots (i.e. locations of models that belong to the module), delete the existing model root unless you want to preserve or create code that you write in MPS as part of your runtime library.

    2. Second, also in the 「共通」タブ , click on Add Model Root, select javaclasses for classes or jars, select javasource_stubs for Java sources and navigate MPS to your lib folder. This will add a new entry into the list of model roots. This entry will represent the "libs" folder

    3. Third, when the new model root is selected in the left-hand side panel, select the folder(s) or jar(s) listed in the right-side panel of the properties dialog and click on the blue "Models" button at the top of the right-hand side panel. The selected folders and jars will be shown with a blue icon next to them in the right-hand side panel.

    4. Switch to the 依存関係 tab and add the JDK solution as a dependency. Do not forget to turn on the エクスポート flag. This will allow your jar files to refer to the JDK classes.

      Model roots6

    5. Then head to the Java タブ to add all the jars or the classes root folders to the ライブラリ part of the window, otherwise the solution using the library classes would not be able to compile. When using java_sourcestubs, add the sources into the ソースパス part of the Java タブ window, instead. Also add any dependencies of the libraries that you have added to the module.

      Model roots2

    6. Additionally, set ソリューションの種類 to その他 to have MPS reload the classes properly.

  4. A new folder named stubs should appear in your solution

    Model roots3
    .

  5. Now after you import the solution into another module (solution, language, generator) the classes will become available in that module's models.

  6. The languages that want to use the runtime solution as a runtime dependency of the code that gets generated by the language's generator will need to refer to it in the ランタイムソリューション section of the ランタイム tab of their module properties.

    Model roots4

  7. Include the runtime jars in the build models - If you use the MPS build scripts to build a plugin with your languages you should also package the runtime libraries in the plugin by copying them into the desired location within the target layout definition.

    Model roots5

    If you forget to do so, you'll be getting errors like "No such path in local layout" when rebuilding the build script's model.

言語

Languages represent a language definition and consist of several models, each of which represent a distinct aspect of the language. Languages also contain a single 生成プログラム module. The properties dialog for languages is in many ways similar to the one of ソリューション . Below we will only mention the differences:

Language1

共通

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

依存関係

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

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

  • Default- only makes the models of the other language/solution available for references (aggregation)
    The structure aspects manifest languages they incorporate by aggregation (i.e. using a foreign concept in a child role), there's no need to import such languages explicitly into a model that uses the aggregating language or to 'extend' language modules.

  • Extends - allows the language to define concepts extending concepts from the there language

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

使用言語

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

ランタイム

  • ランタイムソリューション - lists solutions of reusable code that the language requires. See the "Adding external Java classes and jars to a project - runtime solutions" section above for details on how to create such a solution.

  • アクセサーリーモデル - lists accessory models that the language needs. Nodes contained in these accessory models are implicitly available on the Java classpath and the Dependencies of any model using this language.

Java

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

ファセット

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

言語モデル / 側面

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

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

生成プログラム

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

Generator1

共通

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

依存関係

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

  • Default - only makes the models of the other language/solution available for references

  • Extends - the current generator will be able to extend the generator elements of the extended generator

  • Design - the target generator is only needed to be referred from a priority rule of this generator

使用言語

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

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

This tab allows to define priority rules for generators, in order to properly order the generators in the generation process. Additionally, three options are configurable through the check-boxes at the bottom of the dialog:

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

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

  • IOperationContext パラメーター - indicates, whether the generator makes use of the operationContext parameter passed into the queries. The parameter will be removed in the future and generators should gradually stop using it.

Java

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

ファセット

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

ジェネレーターモデル

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

関連ページ:

MPS プロジェクト構造

言語を設計したりコードを書いたりするときには、優れた構造を使用して各部分を移動したり、組み合わせたりすることができます。MPS はこの点で他の IDE と似ています。プロジェクト:プロジェクトは MPS の主な組織単位です。プロジェクトは 1 つ以上のモジュールで構成されており、それら自体がモデルで構成されています。モデルは生成 / コンパイルの最小単位です。以下でこれらの概念を詳細に説明します。モデル:MPS がもたらす大きな違いは次のとおりです。プログラムはテキスト形式ではありません。こ...

世代計画

世代計画:生成計画を使用すると、開発者は自分のモデルに望ましい生成順序を明示的に指定でき、生成プロセスをより適切に制御できます。目的大規模プロジェクトでは、相互ジェネレーターの優先順位を指定するのが面倒になるかもしれません。さらに、優先順位を指定するためには、適切な相互依存関係を宣言することによって関係言語が互いについて知る必要があります。これは、(時に望ましい)独立性を破ります。生成計画は、生成ステップの適切な順序付けの責任を単一の場所、つまり生成計画にまとめます。これにより、言語設計者は、

依存関係アナライザー - モデルの依存関係を分析する

依存関係アナライザーはモジュールまたはモデル間の依存関係を報告できます。メインメニューから、あるいはモジュール / モデルのポップアップメニューから呼び出すことができます。下部のパネルに表示される対話型レポートでは、他のモジュール、モデル、およびノード別に、モジュール、モデル、ノードの使用状況を表示できます。右側のパネルには、左側のリストで選択した要素が依存しているモジュールとモデルが表示されます。下部パネルには、現在選択されている依存関係を必要とする実際の場所が一覧表示されます。L アイコンを使...