実行構成
導入
実行構成により、ユーザーは自分の言語で書かれたプログラムの実行方法を定義できます。
既存の実行構成は、メインツールバーにある実行構成ボックスから実行できます。
![runConfig1.png runConfig1.png](https://resources.jetbrains.com/help/img/idea/2024.1/runConfig1.png)
メインメニューのファイル名を指定して実行メニュー項目
![runConfig7.png runConfig7.png](https://resources.jetbrains.com/help/img/idea/2024.1/runConfig7.png)
または実行 / デバッグポップアップ(Alt + Shift + F10 /Alt + Shift + F9)を使用します。
![runConfig6.png runConfig6.png](https://resources.jetbrains.com/help/img/idea/2024.1/runConfig6.png)
実行構成は、ノード、モデル、モジュール、プロジェクトに対して実行 / 作成することもできます。例: JUnit 実行構成では、選択したプロジェクト、モジュール、モデル内のすべてのテストを実行できます。独自の実行構成にこのような動作を実装する方法の詳細については、「生産者」を参照してください。
![runconfig3.png runconfig3.png](https://resources.jetbrains.com/help/img/idea/2024.1/runconfig3.png)
![runconfig4.png runconfig4.png](https://resources.jetbrains.com/help/img/idea/2024.1/runconfig4.png)
![runconfig5.png runconfig5.png](https://resources.jetbrains.com/help/img/idea/2024.1/runconfig5.png)
まとめると、実行構成は次のことを定義します。
作成段階では:
構成名、キャプション、アイコン。
構成の種類
ノード、モデル、モジュール、プロジェクトから構成を作成する方法。
構成段階では:
永続パラメーター
永続パラメーター用のエディター。
永続パラメーターの妥当性のチェッカー
実行段階では:
実際に実行されるプロセス
すべてのタブ、アクションボタン、実際のコンソールウィンドウを備えたコンソール。
この構成をデバッグするために必要なもの(可能な場合)
MPS の実行構成をサポートするために、以下の言語が導入されました。
jetbrains.mps.execution.common
(共通言語) - 他の実行言語で利用されている概念を含みます。jetbrains.mps.execution.settings
(設定言語) - さまざまな設定エディターを定義するための言語。jetbrains.mps.execution.commands
(コマンド言語) - Java からの呼び出しを処理します。jetbrains.mps.execution.configurations
(構成言語) - 実行構成定義。
設定
設定言語は設定エディターを作成し、互いに統合することを可能にします。設定エディターに必要なものは次のとおりです。
編集するフィールド
フィールドの正当性の検証
エディターの UI コンポーネント。
UI コンポーネントから設定を適用したり、UI コンポーネント内の設定を保存状態にリセットしたりするための関数の適用 / リセット。
不要になった UI コンポーネントを破棄する関数
ご覧のとおり、設定には UI コンポーネントがあります。通常、1 つの UI コンポーネントが複数の設定インスタンスに対して作成されます。設定では、言語設定は通常「設定」と呼ばれ、その UI コンポーネントは「エディター」と呼ばれます。
設定言語の主な概念は PersistentConfigurationTemplate
です。次の節があります。
永続プロパティ - このセクションでは、編集中の実際の設定について説明します。これらの設定を永続化し(xml への書き込み /xml からの読み取り)、クローンを作成したいため、それらの型には制限があります。それぞれのプロパティは
Cloneable
かString
、または任意のプリミティブ型のいずれかであるべきです。template persistent property
という特別な種類のプロパティもありますが、それらについては後で説明します。editor- このセクションでは、構成のエディターについて説明します。次の機能を保持します:
create
、apply to
、reset from
、dispose
セクションでは、エディターの一部のオブジェクトを格納するフィールドを定義することもできます。create
関数は、エディターのメイン UI コンポーネントである swing コンポーネントを返す必要があります。apply to
/reset from
関数は、エディターの設定をパラメーターとして指定された構成に適用またはリセットします。dispose
関数はエディターを破棄します。check - このセクションでは永続的なプロパティが正しいかどうかチェックされます。一部のプロパティが無効な場合は、
report error
ステートメントを使用できます。基本的に、この文はRuntimeConfigurationException
をスローします。追加の方法 - このセクションは設定で使用される方法のためのものです。基本的に、これらのメソッドは構成インスタンスメソッドです。
永続的なプロパティ
永続プロパティは Cloneable
または String
のいずれか、任意のプリミティブ型になることができると上記で説明しました。しかし、実行構成内で設定言語を使用する場合、それらのプロパティは xml 永続性もサポートする必要があります。文字列とプリミティブは通常どおり永続化されます。オブジェクトにとって、永続性はさらに複雑です。オブジェクトには、パブリックインスタンスフィールドと、setXXX および getXXX メソッドを持つプロパティの 2 種類のプロパティが保持されています。永続プロパティに複雑な型を使用したい場合は、すべての重要なフィールドをパブリックにするか、永続化したいものすべてに setXXX および getXXX メソッドを提供する必要があります。
構成を互いに統合する
設定言語の 2 つの基本機能の 1 つは、ある設定を別の設定に簡単に統合できることです。そのために template persistent properties
が使われています。
テンプレートパラメーター
設定言語の 2 番目の基本機能はテンプレートパラメーターです。これらは java のコンストラクターパラメーターに多少似ています。例: ノードを選択するための設定を作成する場合、彼はノードの概念を使用して設定をパラメーター化したいと思うかもしれません。この場合、概念は永続的なパラメーターではありません。ユーザーによって選択されることはありません。これは構成作成時に指定されたパラメーターです。
コマンド
Commands 言語を使用すると、コマンドラインから実行する方法でコードからプロセスを起動できます。言語の主な概念は CommandDeclaration
です。宣言では、コマンドパラメーターとこのパラメーターで処理を開始する方法を指定します。また、コマンドはデバッガーパラメーターといくつかのユーティリティメソッドを持つことができます。
実行コマンドセクション
各コマンドは複数の execute
セクションを持つことができます。このセクションのそれぞれはいくつかの実行パラメーターを定義します。必須とオプションの 2 つの型のパラメーターがあります。オプションのパラメーターはデフォルト値を持つことができ、コマンドの開始時に省略することができますが、required はデフォルト値を持つことはできず、それらは必須です。コマンドの任意の 2 つの実行セクションには、必須パラメーターの(型ごとに)異なるリストがなければなりません。ある実行セクションが別の実行セクションを呼び出すことができます。各実行セクションは、process
または ProcessHandler
型のいずれかの値を返す必要があります。
ProcessBuilderExpression
コマンド実行セクションから処理を開始するには、ProcessBuilderExpression
が使用されます。コマンド部分の簡単なリストです。各部分は、string
または list<string>
型の式で構成される ProcessBuilderPart
、またはキー付きのパラメーターを表す ProcessBuilderKeyPart
(「-classpath/path/to/classes」など)です。ProcessBuilderExpression
から生成されたコードが呼び出されると、各部分は NULL または空であるかどうかがテストされ、そうでない場合は省略されます。その後、各部分はスペースで複数の部分に分割されます。そのため、コマンド部分にスペースを入れて、それを分割したくない場合(たとえば、スペースを含むファイルパスがある場合)、それを二重引用符(")で囲む必要があります。作成されたプロセスのインスペクターで指定することができます。
デバッガー統合
コマンドをデバッガーと統合するには、2 つのことを指定する必要があります。
統合する特定のデバッガー
プロセスのコマンドライン引数
デバッガーを指定するには、DebuggerReference
(jetbrains.mps.debug.apiLang
の debugger
型の式)を使用して、特定のデバッガーを参照します。デバッガー設定は、タイプ IDebuggerSettings
のオブジェクトでなければなりません。
構成
設定言語は実行構成を作成することを可能にします。実行構成を作成するには、on で RunConfiguration
のインスタンス(基本的には設定言語からの構成)を作成し、それに RunConfigurationExecutor
を提供する必要があります。この構成の種類を指定する RunConfigurationKind
、ノード、モデル、モジュールからこの構成を作成する方法を指定する RunConfigurationProducer
、および実行前に構成を準備する方法を指定する BeforeTask
も必要になる場合があります。
執行者
Executor はノードであり、この実行構成に対してプロセスがどのように開始されるかを記述しています。ユーザーが入力した設定を受け取り、そこからプロセスを作成します。そのため、エグゼキュータの execute メソッドは、process
型のインスタンスを返すべきです。これは StartProcessHandlerStatement
を介して行われます。型 process
または ProcessHandler
を持つものはすべてそれに渡すことができます。process
は 3 つの異なる方法で作成できます。
コマンド経由。
ProcessBuilderExpression
経由(コマンド内でのみ使用することをお勧めします)。ProcessHandler クラスの新しいインスタンスを作成します。この方法は、リモートデバッグ用の実行構成を作成していて、実際にプロセスを開始する必要がない場合など、上記の 2 つが適切でない場合にのみ推奨されます。
エグゼキュータ自体は、次のセクションで構成されています。
この executor の対象となる構成、およびその別名が指定されている "for" セクション。
この設定を実行 / デバッグする機能が指定されている "can" セクション。このエグゼキュータでコマンドが使用されていない場合は、ここに
DebuggerConfiguration
のインスタンスを指定する必要があります。Make など、この構成の実行前に実行できるタスクの呼び出しを含む「before」セクション。
プロセス自体が作成される "execute" セクション
デバッガー統合
コマンドを使用してプロセスを開始する場合は、設定をデバッグ可能として指定すること以外は何もしないでください(executor で "debug" を選択することによって)。ただし、カスタムデバッガー統合が必要な場合は、コマンド宣言と同じ方法で行われます。
生産者
実行構成のプロデューサーは、さまざまなノードまたはノードのグループ、モデル、モジュール、プロジェクトに対してこの構成を作成する方法について説明します。これにより、各プロデューサーのコンテキストメニューに選択された項目の実行を提案するアクションが表示されるため、実行構成をユーザーにとって簡単に見つけることができます。また、最初に編集ダイアログを見ずに何かを実行するデフォルトの方法を提供するため、これは設定を単純化します。
各プロデューサーは、作成する実行構成を 1 つ指定します。構成の生成元となるソースの種類ごとに、セクションからの複数の生成元を持つことができます。このソースは、node <>、nlist <>、model、module、project のいずれかになります。ソースとは別に、セクションからの各プロデュースには、作成セクション(ソースでパラメーター化された概念関数)があります。この関数は、作成された実行構成を返すか、何らかの理由で作成できない場合は null を返します。
便利な例
このセクションでは、実行構成の使用箇所に関するいくつかの役立つヒントと例を見つけることができます。
パーソンエディター
この例では、"Person" のエディターが作成されています。このエディターは、人物の 2 つのプロパティ、名前とメールアドレスを編集します。
![personEditor.png personEditor.png](https://resources.jetbrains.com/help/img/idea/2024.1/personEditor.png)
PersonEditor は、次のように java コードから使用できます。
実行コマンド
これは、特定の workingDirectory
内の programParameters
を使用して特定の executable
を開始する単純なコマンドの例です。
![exec.png exec.png](https://resources.jetbrains.com/help/img/idea/2024.1/exec.png)
タスクの前に gcc でコンパイルする
これは、gcc
コマンドでソースファイルのコンパイルを実行する BeforeTask
の例です。また、実行構成実行プログラムの外部でコマンドを使用する方法も示しています。
![compilegcc.png compilegcc.png](https://resources.jetbrains.com/help/img/idea/2024.1/compilegcc.png)
これは単なる例にすぎないことに注意してください。実際のシナリオでは、たとえばコンパイル中にタスクに進行状況ウィンドウが表示されるはずです。
Java エグゼキュータ
これは MPS からの Java 実行構成のための実際の executor です。
![java.png java.png](https://resources.jetbrains.com/help/img/idea/2024.1/java.png)
Java プロデューサー
これは MPS からの Java 実行構成のプロデューサーです。
![producer.png producer.png](https://resources.jetbrains.com/help/img/idea/2024.1/producer.png)
ここに 3 つの「プロデュース」セクションがあります。ここでは、ClassConcept
、StaticMethodDeclaration
、IMainClass
のノードから Java 実行構成が作成されます。
java クラスに生成されたノードの実行
main メソッドを使って java クラスに生成される概念のノードがあり、このノードを MPS から実行したいとしましょう。この場合、実行設定を作成する必要はありませんが、次の手順を実行する必要があります。
実行したいコンセプトは
jetbrains.mps.execution.util
言語からIMainClass
コンセプトを実行するべきです。ノードをいつ実行できるかを指定するには、isNodeRunnable
メソッドをオーバーライドします。そのためにユニット情報を生成する必要があります。実行するクラス名を正しく特定するためにユニット情報が必要です。MPS ドキュメントのデバッガーセクションで、すべてのトレース情報と同様に、ユニット情報についてさらに読むことができます。この確認を確実にするために、以下の条件の 1 つが満たされていることを確認してください。
ノードから
jetbrains.mps.baseLanguage
からClassConcept
が生成されます。ノードはテキストに生成され(言語は生成に
textGen
アスペクトを使用します)、ノードの概念はjetbrains.mps.traceable
からUnitConcept
インターフェースを実装します。ノードは、3 つの指定された条件のうちの 1 つが満たされるという概念に分類されます。
関連ページ:
![](https://resources.jetbrains.com/help/img/idea/2024.1/map-entry-viewer.png)
デバッガー
MPS は、カスタムデバッガーを作成し、java のデバッガーと統合するための API を提供します。MPS デバッガー機能の説明については、デバッガーの使用箇所ページを参照してください。基本:ユーザーモデルから生成されるコードをデバッグするために、MPS は以下をする必要があります: デバッガーでシームレスに 2 つの世界を一致させることができるようにするために、生成されたコードまでユーザモデルのノードを追跡します、どのノードにどのタイプのブレークポイントを作成できるかを理解する、デバッガーで...
![](https://resources.jetbrains.com/help/img/idea/2024.1/Findx1.png)
使用箇所の検索
MPS では、どのモデルもノードで構成されています。ノードはさまざまな種類の関係を持つことができます。これらの関係はノード構造(たとえば、クラス上の「クラス子孫」関係)で表現されていてもいなくてもよい(たとえば、メソッド上の「オーバーライドメソッド」関係)。使用箇所の検索は与えられたノードに対していくつかの特別に関連したノードを表示するためのツールです。MPS では、使用箇所の検索システムは完全にカスタマイズ可能です - 独自の実体、いわゆるファインダーを書くことができます。そしてそれは関連する...
![](https://pleiades.io/icons/mps.png)
エラーを抑制する
MPS で高品質のコードを維持するための非常に効果的な方法の 1 つは、エラー、警告、潜在的な問題をコード内で直接ハイライトする即時のコード分析です。他のコード品質報告ツールと同様に、ユーザーが誤検知をマークして繰り返し報告されないようにできることが不可欠です。MPS はエラーを抑制するために 2 つのメカニズムを提供し、それらがエディターおよびモデルチェッカーツールに表示されるのを防ぎます。1 つ目は、言語開発者が利用できる一般的なものです。言語拡張を設計したり、既存の言語を新しい言語に埋め込...