言語のためのスタンドアロン IDE を構築する
導入
スタンドアロン IDE という用語は、特定のビジネス目的に必要なアーティファクトのみを含む、IDE の簡略版を指します。スタンドアロン IDE はエンドユーザーに DSL を配布する便利な方法を提供します。エンドユーザーは、IDE 設計者が用意した IDE サポート、リファクタリング、コード分析を含む言語を、専用の IDE で快適に使用できます。気になる言語設計関連の機能や不要な言語はすべて削除されます。
言語を設計したら、MPS を使用すると、これらのドメイン固有の言語を使用するために必要なアーティファクトのみを含む MPS の簡易バージョンを構築できます。MPS のさまざまな側面を削除またはカスタマイズして、特定のユーザーグループにカスタムのユーザーエクスペリエンスを提供できます。この記事ではその方法について説明します。
特に、MPS の以下の側面をカスタマイズできます。
さまざまなアイコン、スローガン、スプラッシュスクリーン、イメージ
ヘルプ URL
ユーザーが利用できる一連の言語
MPS で利用可能なプラグインのセット
プロセスの概要
MPS のカスタム RCP バージョンをビルドするには、いわゆるビルドスクリプトを含むソリューションを作成する必要があります。ビルドスクリプトは MPS のビルド言語で記述されており、RCP アプリケーション(および IntelliJ および MPS プラグイン)のビルド用に最適化されています。このビルドスクリプトのジェネレーターを実行すると、MPS は実際の RCP ディストリビューションを作成する ant ファイルを生成します。
サンプル RCP ビルドの構築
このドキュメントでは、MPS ディストリビューションにバンドルされているロボット Kaja サンプル用の RCP ビルドスクリプトの開発について説明します。MPS でプロジェクトを開き、ここで説明されている手順に従うことができます。
ソリューションとビルドスクリプトの作成
ウィザードの方法
必要なビルドスクリプトを作成するための望ましい方法は、現在のプロジェクトでソリューション構築ウィザードを実行することです。プロジェクトビューツールウィンドウから起動します。
ウィザードは、スクリプトを保持し、必要なインポートと使用言語を設定するための新しいソリューションとモデルを作成します。新しいソリューションを作成する代わりに、既存のソリューションまたはモデルを再利用するようにウィザードに指示できます。
次に、3 つの使用可能なオプションからスタンドアロン IDE オプションを選択する必要があります。
ウィザードの最後のページで、IDE の一部にしないモジュールを選択解除します。通常、サンドボックスモジュールをスキップして、言語とプラグインおよびランタイムソリューションを保持します。
新しいソリューションがプロジェクトビューにリストされ、2 つの新しいビルドスクリプトが保持されます。
依存関係も正しく設定されています。
手動による方法
あるいは、手動でスクリプトを作成することもできます。内部に新しいモデルを使用して新しいソリューションを作成する必要があります。モデルで、使用言語を設定します
jetbrains.mps.build
jetbrains.mps.build.mps
また、jetbrains.mps.ide.build モデルをインポートします。これで、モデルに新しいビルドプロジェクトを作成できます(名前はわかりにくいです。実際には新しいビルドプロジェクトではなく、ビルドスクリプトだけです)。
ビルドスクリプトの調査
ビルドスクリプトにはいくつかのセクションが含まれています。これらのセクションは、空のビルドスクリプトで確認できます。
ビルドスクリプトのさまざまなセクションを見てみましょう。
ベースディレクトリベースディレクトリは、他のすべてのパスが指定される相対パスを定義します。デフォルトでは、これは、結果の ant ファイルが生成され、実行されるディレクトリです。
プラグインを使用するビルド言語自体はプラグインを介して拡張できます(これらは MPS 自体を構成するプラグインではないことに注意してください。これらは後で構成されます)。これらのプラグインは、追加のビルド言語構文に貢献します。通常、java および mps プラグインが必要です。以下では、これらのプラグインによって提供される構文を使用します。
マクロマクロは本質的に名前と値のペアです。「マクロ」セクションでは、これらの名前が定義され、値が割り当てられます。ビルドスクリプトの残りの部分では、これらのマクロ変数が使用されます。MPS は 2 種類のマクロをサポートしています。var マクロは文字列であり、任意の値を割り当てることができます。フォルダーは、上記で定義され、他のマクロに基づいて定義されたベースディレクトリに対する相対パスを表します。MPS はフォルダーマクロ内のパスコンポーネントにコード補完を提供することに注意してください。
依存関係このセクションでは、他のビルドスクリプトへの依存関係を定義します。MPS は、ビルドスクリプト(たとえば buildStandalone、buildWorkbench または buildMPS)のセットがバンドルされています。それらのいずれかへの依存関係を確立することにより、その参照ビルドスクリプトで定義された構造を、参照ビルドスクリプトで使用できます。例: 参照されているビルドスクリプトで定義されているマクロを使用できます。
プロジェクト構造このセクションでは、構築する RCP アプリケーションの実際の内容を定義します。そのようなコンテンツは MPS モジュール(言語、ソリューション、devkits)、Java ライブラリ、IDEA ブランディングおよびプラグインかもしれません。
デフォルトレイアウトこのセクションは出力されるファイルを定義し、新しい RCP ディストリビューションのディレクトリ、ファイルと JAR 構造を作成します。これは、プロジェクト構造セクションおよびこれが依存する他のビルドスクリプトで定義されているアーティファクトを参照して含めます。
ウィザードは 2 つのビルドスクリプトを作成しました。それぞれが別々の目的を果たします。
Kajak- モジュールを生成し、生成されたソースをコンパイルして、IDEA プラグインにパッケージ化します (IntelliJ IDEA プラットフォーム用のプラグイン)
KajakDistribution - Kajak によって作成されたアーティファクトからプラットフォーム固有のディストリビューションを作成します
ビルドスクリプトを編集する
最初に Kajak ビルドスクリプトに注目しましょう。
生成されたビルドスクリプトの名前
各 MPS ビルドスクリプトから生成する ant xml ファイルのデフォルト名は build.xml です。複数のビルドスクリプト間の衝突を避けるために、名前を変更することをお勧めします。
ベースディレクトリ
ビルドスクリプトが生成されるディレクトリを指定します。
プラグインを使う
ビルド言語は、その機能をプラグインにパッケージ化しています。ビルドスクリプトで使用されるプラグインは、その使用プラグインセクションにリストされています。
java - Java ソースをコンパイルする機能を含みます
mps - MPS モデルを生成する機能を含みます
module-tests - ビルドスクリプトでテストを実行する機能を追加します (jetbrains.mps.build.mps.tests 言語をインポートする必要があります)
ウィザードはすでに java と mps を設定しています。
マクロ
スクリプト全体で再利用するマクロをいくつか定義する必要があります。最初の 2 つはビルドで使用する文字列変数を表し、一連のフォルダーは MPS 自体のディレクトリと、MPS にバンドルされた言語が格納される 2 つのルートディレクトリを表します。これらの言語は、RCP ディストリビューションの一部になります。これらのフォルダーはすべて、ベースディレクトリに対してどのように相対的であるかに注意してください。
マクロを未定義のままにして(つまり、名前を指定するだけで)、プロジェクト設定ダイアログの MPS パス変数セクションで定義するか、プロパティ定義を使用して ant を呼び出すときに定義できることに注意してください。
依存関係
次に、依存関係を定義します。依存関係は、このスクリプトが他のどのビルドスクリプトおよびプラットフォームに依存しているかを示します。
mpsStandalone (スタンドアロン MPS インストールの最小セットを表す)への依存関係が必要です。オプションで、スタンドアロン IDE でビルドスクリプトを作成できる mpsMakePlugin 、mpsDebuggerPlugin (ロボット Kaja サンプルにはデバッガーと Java 実行の統合が必要なため)および mps ExecutionPlugin(1 つは、ロボット Kaja サンプル言語が実行フレームワークを使用して外部実行可能ファイルを実行することです。ほとんどの RCP は、mps スタンドアロンを使用する可能性があります。
アーティファクトの場所は、アーティファクトのコピー元を指定します。ビルドスクリプトは、既存の MPS インストールからコードをコピーすることで機能するため、MPS ソースをチェックアウトする必要はありません。アーティファクトの場所は MPS ホームディレクトリを指している必要があります。
プロジェクト構造
プラグインの使用セクションで指定されたプラグインは、ここで使用可能なオプションに影響を与えます。java、mps、および module-tests プラグインを有効にすると、次のプラグインが得られます。
ジェネレーターオプション - ジェネレーターを設定する
アイデアブランディング - アイコン、スプラッシュスクリーン、URL、イメージなどのスタンドアロン IDE の視覚的側面を設定します。
アイデアプラグイン - 生成されたアーティファクトを基盤となる IntelliJ IDEA プラットフォームにフックするための情報の詳細
Java ライブラリ - それらがユニットとして参照されることができるように jar とクラスをグループ化します
Java モジュール - Java ソースをグループ化して、それらが 1 つのユニットと呼ばれるようにする
Java オプション - java コンパイラープロセスを設定します
mps group - MPS モジュール(ソリューション、言語、devkits)をユニットとして参照できるようにグループ化します
ソリューション - ソリューションを表します
language - 言語を表します
devkit - devkit を表します
プロジェクト構造では、ブランディングから始めます。アイデアブランディングセクションは、あらゆる種類のアイコン、スプラッシュ画面などの定義をサポートしています。サイズと透明度の値を維持しながら、MPS ディストリビューションから取得し、ニーズに合わせてイメージを変更することをお勧めします。Version プロパティが構造化された値を保持していることに注意してください。ヘルプファイルと更新 Web サイトを指定することもできます。
サンプルでは、MPS アイコンを ./icons フォルダーにコピーし、名前を変更せずにそれに応じて変更しました。これが、ほとんどのアイコンが mps で始まる理由です。
次に、バンドルする言語とソリューションを含むアイデアプラグインを定義します。アイデアプラグインは、MPS が構築されている IDEA プラットフォームへのプラグインです。
名前とバージョン、他のプラグインへの依存関係、実際のコンテンツを定義できます。RCP に言語が含まれている場合は常に、jetbrains.mps.core が必要になります。これは、BaseConcept や INamedConcept インターフェースなどを提供するためです。内容の Kajak エントリは、以下で定義される mps グループへの参照です。mps グループは、MPS アーティファクトのグループです。mps プラグインを (ビルドスクリプトの一番上に) 含めたため、MPS 固有の言語構造を使用できます。mps グループは一例です。
Kajak グループを見てみましょう。一連の言語とソリューションを参照します。言語参照は、MPS プロジェクトで定義された言語を指します。グループ内の言語リファレンスは、名前 (実際の言語の名前と同じである必要があります) と、それぞれの mpl ファイルへのポインタで構成されます。これを入力する最も簡単な方法は、mpl ファイルへのパスから開始し、ファイルインテンション (Alt+Enter) から必要な情報をロードして参照の名前を調整することです。
グループにはすべての言語の推移閉包が含まれている必要があることに注意してください。たとえば、言語 A を参照していて、それが別の言語 B を参照している場合、グループには言語 B も含まれている必要があります。これは理にかなっています。そうしないと、依存関係を解決できないため、結果として得られる RCP アプリケーションは実行されないからです。言語が欠落している場合は、ビルドスクリプトでエラーが報告されます (赤い波線)。必要な言語を追加した後、エラーが発生した言語でファイルインテンション (Alt+Enter) から必要な情報をロードし直して、何かが変更されたことを「認識」させる必要がある場合があります。
言語に加えて、ソリューション構成要素を使用してソリューションを参照したり、devkit 構成要素を使用して devkit を参照したりすることもできます。
デフォルトレイアウト
レイアウトは RCP ディストリビューション物のディレクトリとファイル構造を構成します。さまざまなソースから、特に前のセクションで説明したプロジェクト構造からファイルをコピーします。また、必要に応じてこれらのファイルをコンパイル、構築、パッケージ化します。このスクリプトが依存する他のビルドスクリプトで定義されているアーティファクトも参照できます。次のコードから始めます。
インポートされたこれら 2 つは、参照されている mpsStandalone ビルドスクリプトのフォルダー要素です。インポートすることにより、これらのフォルダーの内容が RCP ディストリビューションにインポート(つまりコピー)されます。
ウィザードには、bin フォルダーを作成し、共通の構成ファイルとプロパティファイルをそのフォルダーにコピーするコードが追加されています。さらにカスタマイズすることも、そのままにしておくこともできます。
次に、新しいフォルダー lib を作成します。このフォルダーには、MPS ソースと既存の branding.jar (デフォルトの MPS スプラッシュ画面などを含む)を除くすべてのものを mpsStandalone::lib からインポートします。次に、新しい jar ファイル branding.jar を作成します(この名前が機能する必要があります。IDEA プラットフォームはこの名前を想定しています)。このファイルに、上記で定義したプロジェクト構造のブランディングセクションで定義されたすべてのファイルを配置します。
次に、フォルダープラグインを作成します。mps-core プラグインはすべての RCP アプリに必要であるため、いずれの場合もインポートする必要があります。次に、mpsStandalone ビルドスクリプトで定義されているさまざまなバージョン管理プラグイン(CVS、SVN anf git)をインポートします。明らかな理由から、スタンドアロンの Kaja IDE にはバージョン管理のサポートが必要なので、これらのプラグインをインポートすることは理にかなっています。最後に、Kaja は MPS デバッガーとも統合されているため、デバッガープラグインを含めます。
次に、前にプロジェクト構造で定義された Kajak プラグインを統合します。プラグイン構成要素を使用して、前に定義したプラグインの完全な定義をインポートできます。
プラグイン内で、さまざまなライブラリ jar を含むサブディレクトリをさらに定義します。これらの jar ファイルは、プラグインのクラスパスに自動的に表示されます。ファイル構成を使用して、前に定義したマクロを使用して、さまざまなファイルをプラグインディレクトリにコピーします。
このプラグインには、コピーした jar だけでなく、必要なすべての言語アーティファクトも含まれていることに注意してください。これは、これらの mps グループを定義し、プラグインから参照することで実現されています。これらの mps グループを使用できるのは、mps ビルド言語プラグインのおかげです。MPS アーティファクトを直接サポートし、必要なすべてのファイルとメタデータが自動的に処理されます。
mps-make をインポートすることもできます。
プロパティファイル
最後に、実行中の RCP アプリケーションで使用される一連のメタデータを含む build.number というプロパティファイルを作成します。基盤となる IntelliJ プラットフォームで必要です。
プラットフォーム固有のディストリビューションの作成
この時点で、生成されたディレクトリ構造は、カスタムブランディングを含む、構成したすべてのアーティファクトを含む MPS ディストリビューションのプラットフォームの独立したコアを構成します。ただし、プラットフォーム固有の側面がまだ不足しているため、実行することはできません。
2 番目に生成されたビルドスクリプト - KajakDistribution を見てみましょう。
ビルドスクリプトは Kajak に依存しているため、プラットフォームに依存しないアーティファクトをプラットフォーム固有のディストリビューションに適切にパッケージ化できます。mps_home マクロは、単一のプラットフォーム (macOS、Linux、Windows) を対象とするディストリビューションでは他のプラットフォームに必要なアーティファクトが欠落する可能性があるため、汎用の MPS インストールを指します。汎用ディストリビューションは、MPS Web サイトからダウンロードすることもできます。
Windows ディストリビューションを作成する
ビルドスクリプトによって生成される Windows 固有のディストリビューションはありません。生成されたスタンドアロン IDE を Windows で実行するには、生成された汎用 zip ファイルを使用し、win ディレクトリの内容を bin ディレクトリにコピーし、mps.bat ファイルを使用して IDE を起動する必要があります。
ヒントとコツ
MPS 上に構築されたすべてのスタンドアロン IDE は、ユーザーがツールに慣れるのに役立つ便利なヒントを含むヒントとテクニックダイアログをユーザーに提供できます。
MPS のヒントとコツの内容はカスタマイズできます。これは、新しいビルドスクリプトのヒントとトリックの概念を使用して実行できます。
ヒントは、MPS 一般ディストリビューション物から再利用することも、ディレクトリまたはソリューションからインポートすることもできます。
最初のオプションは、ディストリビューションにすべての MPS のヒントを追加するだけです。これは、ビルドスクリプトウィザードで生成されたビルドスクリプトのデフォルトオプションです。
2 つ目は、正しいヒントの構造を持つ手動で作成されたフォルダーを必要とします。目的の構造は、mps-tips.jar ファイル自体から取得できます。すべての HTML ファイルに加えて css と image フォルダーを含むフォルダーを必要とします。
最後のオプションでは、MPS 自体の jetbrains.mps.build.tips および jetbrains.mps.core.xml 言語を使用してヒントを定義できます。
最後に、ヒントをビルドスクリプトレイアウトの lib フォルダーにパッケージ化する必要があります。ウィザードで生成されたビルドスクリプトでは、MPS のヒントとコツがデフォルトで lib フォルダーにパッケージ化されています。
ヒントとコツの言語
ソリューションからヒントとコツをインポートするには、モデルを使用してソリューションを作成し、モデルの使用言語に言語 jetbrains.mps.build.tips と jetbrains.mps.core.xml を追加します。その後、MPSTipsAndTricks の概念のインスタンスを作成して、そこに複数のヒントを作成することができます。各ヒントは HTML 形式のテキストです。各ヒントに 1 つのイメージを追加できます。
ソリューションからビルドスクリプトヒントとコツへのインポートは、ソリューションと MPSTipsAndTricks の概念から生成された xml を指すことによって行われます。
最後の Robot Kaja IDE 構築スクリプト
カジャック
KajakDistribution
ビルドスクリプトの生成と実行
ビルドスクリプトにエラーがないと仮定すると、エラーを生成できます(モデルの再構築または Ctrl-F9)。これにより、各ビルドスクリプトの上部で定義されている名前が設定された 2 つの ant ファイルが作成されます。
この myBuild.xml (この場合)は、プロジェクトディレクトリに直接存在します。ファイルは、コマンドラインから(ant -buildfile myBuild.xml を使用して)実行することも、MPS 内から直接(プロジェクトエクスプローラーのビルドスクリプトのコンテキストメニューを介して)実行することもできます。
生成されたディレクトリ構造の確認
両方のビルドスクリプトを実行します。次の図は、ビルドスクリプトを実行した後のプロジェクト構造を示しています。特に、build/artifacts ディレクトリ内には、ビルドスクリプトのデフォルトのレイアウトセクションで定義された構造が作成されています。
ディレクトリとファイル構造を参照して、表示されているものをビルドスクリプトの定義に接続することをお勧めします。
JDK の設定
MPS を実行するには、実行用に構成された JDK が必要です。スタンドアロン IDE についても同様です。理想的には、MPS ディストリビューションの一部であり、$MPS_HOME/jbr フォルダーにある JetBrains JDK を使用して実行する必要があります。ビルドスクリプトを使用して、または手動で、MPS の jbr をスタンドアロン IDE にコピーできます (IDE と一緒に JetBrains JDK をディストリビューションする場合)。
起動すると、スタンドアロン IDE のランチャーは、次の場所をこの順序でテストして JDK が存在するかどうかを確認します。次に、最初に見つかった JDK を使用して IDE を実行します。
Windows の場合:
MPS_JDK 環境変数
mps64.exe.jdk システムプロパティ
..\jbr フォルダー(JetBrains JDK が IDE にバンドルされていると仮定)
JDK_HOME 環境変数
JAVA_HOME 環境変数
Linux の場合:
MPS_JDK 環境変数
.../mps.jdk、.../jbr、.../jbr-x86 フォルダー(JetBrains JDK が IDE にバンドルされている場合、これらのフォルダーのいずれか)
JDK_HOME 環境変数
JAVA_HOME 環境変数
システムの定義済み Java ディストリビューションセットアップの $PATH の場所に「java」
MacOS の場合:
システムの定義済み Java ディストリビューションセットアップの $PATH の場所に「java」
スタンドアロン IDE での信頼プロジェクトダイアログ
IntelliJ ベースの IDE でプロジェクトを開くと、開かれているプロジェクトの一部である有害なコードが実行される可能性があることをユーザーに警告するために、プロジェクトを信頼するダイアログがプラットフォームに追加されました。
Trust プロジェクトダイアログは MPS 2021.3 の一部になりました。ただし、ダイアログを MPS プロジェクトに適用するには追加のカスタマイズが必要だったため、MPS では無効にすることが決定されました。2021.3 のダイアログにはプレビューボタンが含まれていますが、MPS はプロジェクトをセーフモードで開くことができないため、MPS アプリケーションには関係ありません。MPS 自体では無効になっていますが、MPS 2021.3 のビルドスクリプトウィザードにより、顧客のスタンドアロン IDE でプロジェクトを信頼するダイアログが有効になりました。MPS 2022.2 以降、採用された 2 ボタンのプロジェクトを信頼するダイアログは、MPS と MPS ベースのスタンドアロン IDE の両方で有効になっています。2022.2 以降のビルドスクリプトウィザードにより、スタンドアロン IDE でこの新しいダイアログが有効になります。MPS 2021.3、2022.2 以降のビルドスクリプトウィザードによって作成され、2022.2 以降を使用してビルドされたスタンドアロンアプリケーションには、新しい「2 ボタン」プロジェクトを信頼するダイアログが提供されます。
スタンドアロンの MPS ベースの IDE でプロジェクトを信頼するダイアログを無効にするには、起動スクリプトまたは「vmoptions」構成ファイルで -Didea.trust.disabled=true vm オプションを使用します。
スタンドアロン IDE で新しい UI を無効 / 有効にする
MPS は従来の UI と新しい UI、スタンドアロン IDE をサポートしているため、ビルドスクリプトでは、生成されたスタンドアロン IDE のユーザーに対して新しい UI を有効または無効にする方法が提供されます。
現在、IDE のユーザーに提供される UI バリアントに影響し、ビルドスクリプトで指定 / 変更できる vm オプションが 2 つあります。
-Dide.experimental.ui は、 IDE の新規ユーザーに対して新しい UI をオンまたはオフに切り替えます。このオプションは、2023.3 および 2024.1 のスタンドアロン IDE ビルドスクリプトでは false に設定されています。
-Dexperimental.ui.used.once が存在する場合、新しい UI をユーザーに通知するツール内の自動プロモーションが無効になります。このオプションは、2023.3 および 2024.1 のスタンドアロン IDE ビルドスクリプトではデフォルトでオンに設定されています。
新しく生成された IDE には、ジェネレーターによって設定された -Dexperimental.ui.used.once プロパティが設定されます。既存の起動スクリプトは手動で変更するか、MPS の新しいバージョンで再生成する必要があります。スタンドアロン IDE のユーザーに対してバナーを有効にする場合は、ビルドスクリプトからプロパティを手動で削除します。
MPS 2024.2 では、新しい UI がデフォルトのオプションになる可能性が高く、新しく作成されたビルドスクリプトにそれが反映されます。
関連ページ:
プロジェクトのセキュリティ
潜在的なセキュリティリスクを防ぐために、MPS では、プロジェクトのソースがわからない場合にプロジェクトを開く方法を決定できます。MPS は、オープニングプロセス中に実行されるタスクまたは構成について警告し、信頼できるソースを構成できるようにします。不明なソースからプロジェクトを開く:プロジェクトを開くと、MPS を使用すると、未知ソースコードを含むプロジェクトの処理方法をすぐに決定できます。プロジェクトを初めて開くたびに、IDE にプロジェクトを信頼ダイアログが表示されます。これは、プロジェ...
MPS 言語プラグインの構築
言語セットを作成し、それを対象ユーザーが利用できるようにしたいと考えています。このドキュメントでは、言語セットを、それらが依存するランタイムと一緒に、有効な MPS プラグインにパッケージ化する方法について説明します。注: MPS に付属の JavaExtensionsSample サンプルプロジェクトには、サンプルの Java 拡張機能をビルドしてプラグインにパッケージ化するための完全に機能的なビルドスクリプトが含まれています。そこからインスピレーションを受けることができます。出発点:あなた...
ブートストラップ依存関係の問題の除去
定義::いつでもそれ自体を使用する言語または、言語を使用し、その言語が機能するために同じソリューションを必要とする(つまり、間接的または直接依存する)ソリューション、ブートストラップ依存関係の問題があります。なぜこれが問題なのですか:ビルドスクリプトを使用してプロジェクト全体をゼロから再構築することはできません、生成されたアーティファクトを VCS リポジトリに保持する必要があります、このブートストラップ依存関係サークルは、プロジェクトが完全に一から再構築されることを防ぎます。代わりに、言語を...