言語のためのスタンドアロン IDE を構築する
導入
スタンドアロン IDE とは、特定のビジネス目的に必要な機能のみを備えた、IDE の簡素化されたバージョンを指します。スタンドアロン IDE は、エンドユーザーに DSL を配布するための便利な手段を提供します。エンドユーザーは、言語設計者が用意した IDE サポート、リファクタリング、コード解析機能など、すべての機能を専用 IDE の快適さの中で利用できます。煩わしい言語設計関連の機能や不要な言語はすべて削除されています。
言語を設計したら、MPS を使用すると、これらのドメイン固有の言語を使用するために必要なアーティファクトのみを含む MPS の簡易バージョンを構築できます。MPS のさまざまな側面を削除またはカスタマイズして、特定のユーザーグループにカスタムのユーザーエクスペリエンスを提供できます。この記事ではその方法について説明します。
特に、MPS の以下の側面をカスタマイズできます。
さまざまなアイコン、スローガン、スプラッシュスクリーン、イメージ
ヘルプ URL
ユーザーが利用できる一連の言語
MPS で利用可能なプラグインのセット
プロセスの概要
MPS のカスタム RCP バージョンをビルドするには、いわゆるビルドスクリプトを含むソリューションを作成する必要があります。ビルドスクリプトは、RCP アプリケーション(および MPS プラグイン)のビルドに最適化されている MPS ビルド言語で記述されています。このビルドスクリプトのジェネレーターを実行すると、MPS は実際の RCP ディストリビューションを作成する ant ファイルを生成します。
サンプル RCP ビルドの構築
このドキュメントでは、MPS ディストリビューションにバンドルされているロボット Kaja サンプル用の RCP ビルドスクリプトの開発について説明します。MPS でプロジェクトを開き、ここで説明されている手順に従うことができます。
ソリューションとビルドスクリプトの作成
ウィザードの方法
必要なビルドスクリプトを作成するための望ましい方法は、現在のプロジェクトでソリューション構築ウィザードを実行することです。プロジェクトビューツールウィンドウから起動します。

ウィザードは、スクリプトを保持し、必要なインポートと使用言語を設定するための新しいソリューションとモデルを作成します。新しいソリューションを作成する代わりに、既存のソリューションまたはモデルを再利用するようにウィザードに指示できます。


次に、3 つの使用可能なオプションからスタンドアロン IDE オプションを選択する必要があります。

ウィザードの最後のページでは、IDE に組み込まないモジュールの選択を解除します。通常は、サンドボックスモジュールをスキップし、言語、プラグイン、ランタイムソリューションはそのまま残します。

新しいソリューションはプロジェクトビューにリストされ、3 つのルートノード (そのうち 2 つは新しいビルドスクリプト) が保持されるはずです。

依存関係も正しく設定されています。


生成されたビルドスクリプトを動作させるには、いくつか変更が必要です。その一つは、汎用 MPS ディストリビューションをダウンロードし、ドライブに解凍し、生成されたビルドスクリプトの両方の mps_home マクロを、解凍した汎用ディストリビューションのフォルダーを指すようにすることです。

次に、エディターが次のような問題を報告した場合:

実際の依存関係を再ロードしてスクリプトを更新するインテンションをトリガーする必要があります。

ここでの言語ランタイムにはイメージが付属しているため、ビルドスクリプトによって作成される言語プラグインにイメージを適切にパッケージ化する必要があります。

ここで、ビルドモデルを再構築し、ビルドスクリプトの実行を試みます。これについては、後のセクションで詳しく説明します。

手動による方法
あるいは、スクリプトを手動で作成することもできます。その場合は、新しいモデルを含む新しいソリューションを作成する必要があります。モデルで使用する言語を設定します。
jetbrains.mps.build
jetbrains.mps.build.mps
jetbrains.mps.build.startup
また、jetbrains.mps.ide.build モデルを依存関係にインポートします。これで、モデル内に新しいビルドプロジェクトを作成できます(名前が分かりにくいですが、実際には新しいビルドプロジェクトではなく、ビルドスクリプトです)。

ビルドスクリプトの調査
ビルドスクリプトにはいくつかのセクションが含まれており、空のビルドスクリプトでは次のセクションを確認できます。

ビルドスクリプトのさまざまなセクションを見てみましょう。
ベースディレクトリベースディレクトリは、他のすべてのパスの絶対パスを定義します。デフォルトでは、このディレクトリに ant ファイルが生成され、実行されます。また、ビルドスクリプトから参照するには、MPS モジュール記述子ファイルをこのフォルダーまたはそのサブフォルダーに配置する必要があります。
プラグインの使用ビルド言語自体は、ビルドスクリプトプラグインを介して拡張できます(ただし、これらは MPS 自体を構成するプラグインではありません。これらは後で設定します)。これらのプラグインは、追加のビルド言語構文を提供します。通常、Java コンパイルと MPS 生成タスクを指定するには、java プラグインと mps プラグインが必要です。以下では、これらのプラグインが提供する構文を使用します。jetbrains.mps.build.mps.tests で利用可能な module-tests プラグインを使用すると、ビルドスクリプトからテストを実行できます。
マクロマクロは本質的に名前と値のペアです。「マクロ」セクションでは、これらの名前が定義され、値が割り当てられます。ビルドスクリプトの残りの部分では、これらのマクロ変数が使用されます。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_home フォルダーのマクロは、MPS の汎用ディストリビューション版を解凍したディレクトリを指します。これらのフォルダーはすべてベースディレクトリからの相対パスになっていることに注意してください。
マクロを未定義のままにして(つまり、名前を指定するだけで)、プロジェクト設定ダイアログの MPS パス変数セクションで定義するか、プロパティ定義を使用して ant を呼び出すときに定義できることに注意してください。
依存関係
次に、依存関係を定義します。依存関係は、このスクリプトが他のどのビルドスクリプトおよびプラットフォームに依存しているかを示します。
mpsStandalone (スタンドアロン MPS インストールの最小セット)への依存関係が必要です。また、オプションとして、スタンドアロン IDE でビルドスクリプトを作成できるようにする mpsMakePlugin、mpsDebuggerPlugin (ロボット Kaja サンプルがデバッガーと Java 実行の統合を必要とするため)、mps ExecutionPlugin (ロボット Kaja サンプル言語の 1 つが実行フレームワークを使用して外部実行ファイルを実行するため)への依存関係も必要です。ほとんどの RCP は mpsStandalone のみを使用すると思われます。
アーティファクトの場所は、アーティファクトのコピー元を指定します。ビルドスクリプトは既存の汎用 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 を表します
ヒントとコツ - さまざまなヒントの説明を新しい IDE にどのようにバンドルするかを定義します
アイデアブランディング
プロジェクト構造では、まずブランディングから始めます。アイデアブランディングセクションでは、あらゆる種類のアイコンやスプラッシュスクリーンなどの定義をサポートしています。MPS ディストリビューションからイメージを取得し、サイズと透明度の値を維持しながら、ニーズに合わせてイメージを修正することをお勧めします。Version プロパティには構造化された値が保持されていることに注意してください。ヘルプファイルや更新 Web サイトを指定することもできます。

Kaja サンプルプロジェクトでは、MPS アイコンを ./icons フォルダーにコピーしました。
アイデアプラグイン
次に、バンドルする言語とソリューションを含むアイデアプラグインを定義します。アイデアプラグインは、 MPS が構築されている IDEA プラットフォームへのプラグインです。

名前とバージョン、他のプラグインへの依存関係、実際のコンテンツを定義できます。RCP に言語が含まれている場合は、BaseConcept や INamedConcept インターフェースなどを提供する jetbrains.mps.core が必要になります。コンテンツ内の Kajak エントリは、以下に定義されている mps グループへの参照です。mps グループは MPS アーティファクトのグループです。mps ビルドスクリプトプラグイン(ビルドスクリプトの一番上に)を組み込んでいるため、MPS 固有の言語構造を使用できます。mps グループはその一例です。
MPS グループ
Kajak グループを見てみましょう。一連の言語とソリューションを参照します。言語参照は、MPS プロジェクトで定義された言語を指します。グループ内の言語リファレンスは、名前 (実際の言語の名前と同じである必要があります) と、それぞれの mpl ファイルへのポインタで構成されます。これを入力する最も簡単な方法は、mpl ファイルへのパスから開始し、ファイルインテンション (Alt+Enter) から必要な情報をロードして参照の名前を調整することです。

グループにはすべての言語の推移閉包が含まれている必要があることに注意してください。例: 言語 A が別の言語 B を参照している場合、言語 B もグループに含める必要があります。これは当然のことです。そうしないと、依存関係を解決できず、結果として得られる RCP アプリケーションが実行できないためです。言語が不足している場合は、ビルドスクリプトでエラーが報告されます(赤い波線)。必要な言語を追加した後、エラーが発生した言語に対して、ファイルインテンション(Alt+Enter)から必要な情報をロードするコマンドを再実行して、変更があったことを「認識」させる必要がある場合があります。
言語に加えて、ソリューション構成要素を使用してソリューションを参照したり、devkit 構成要素を使用して devkit を参照したりすることもできます。
デフォルトレイアウト
レイアウトは、RCP ディストリビューションのディレクトリとファイル構造を構築します。様々なソース、特に前のセクションで説明したプロジェクト構造からファイルをコピーします。また、必要に応じてこれらのファイルをコンパイル、ビルド、パッケージ化します。また、このスクリプトが依存する他のビルドスクリプトで定義されたアーティファクトを参照することもできます。

まず、次のコードから始めます。

これら 3 つのインポートは、参照されている mpsStandalone ビルドスクリプト内のフォルダーとファイル要素です。これらをインポートすることで、これらのフォルダーの内容が RCP ディストリビューションにインポート(つまりコピー)されます。
ウィザードには、bin フォルダーを作成し、共通の構成ファイルとプロパティファイルをそのフォルダーにコピーするコードが追加されています。さらにカスタマイズすることも、そのままにしておくこともできます。

次に、新しいフォルダー lib を作成します。このフォルダーには、MPS ソースと既存の branding.jar (デフォルトの MPS スプラッシュ画面などを含む)を除くすべてのものを mpsStandalone::lib からインポートします。次に、新しい jar ファイル branding.jar を作成します(この名前が機能する必要があります。IDEA プラットフォームはこの名前を想定しています)。このファイルに、上記で定義したプロジェクト構造のブランディングセクションで定義されたすべてのファイルを配置します。

次に、plugins フォルダーを作成します。mps -core プラグインはどの RCP アプリにも必須なので、必ずインポートする必要があります。次に、mpsStandalone ビルドスクリプトで定義されている様々なバージョン管理プラグイン(SVN および Git)をインポートします。当然のことながら、スタンドアロンの Kaja IDE にはバージョン管理サポートが必要なので、これらのプラグインをインポートするのは理にかなっています。

次に、前にプロジェクト構造で定義された Kajak プラグインを統合します。プラグイン構成要素を使用して、前に定義したプラグインの完全な定義をインポートできます。
ここで、ウィザードでは自動的には実行されない処理を行います。プラグイン内に、様々なライブラリ jar ファイルを含むサブディレクトリを定義します。これらの jar ファイルは、プラグインのクラスパスに自動的に追加されます。file 構成要素を使用し、先ほど定義したマクロを使って、様々なファイルをプラグインディレクトリにコピーします。
このプラグインには、コピーした jar だけでなく、必要なすべての言語アーティファクトも含まれていることに注意してください。これは、これらの mps グループを定義し、プラグインから参照することで実現されています。これらの mps グループを使用できるのは、mps ビルド言語プラグインのおかげです。MPS アーティファクトを直接サポートし、必要なすべてのファイルとメタデータが自動的に処理されます。
プロパティファイル
最後に、実行中の RCP アプリケーションで使用される一連のメタデータを含む build.number というプロパティファイルを作成します。これは、基盤となる IntelliJ プラットフォームで必要です。

次に、スクリプトはビルド番号の値を build.txt ファイルに挿入します。

ヒントとコツ
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 を指すことによって行われます。

プラットフォーム固有のディストリビューションの作成
この時点で生成されたディレクトリ構造は、プラットフォームに依存しない、簡素化された MPS ディストリビューションの中核部分を構成し、カスタムブランディングを含む、設定したすべてのアーティファクトが含まれています。ただし、プラットフォーム固有の要素がまだ欠落しているため、実行することはできません。
2 番目に生成されたビルドスクリプト - KajakDistribution を見てみましょう。

このビルドスクリプトは、プラットフォームに依存しないアーティファクトをプラットフォーム固有のディストリビューションに適切にパッケージ化するために、Kajak ビルドスクリプトに依存しています。mps_home マクロは、MPS の汎用インストールを指しています。これは、単一のプラットフォーム(macOS、Linux、Windows)をターゲットとするディストリビューションでは、他のプラットフォームに必要なアーティファクトが欠落する可能性があるためです。汎用ディストリビューションは、MPS の Web サイトからダウンロードすることもできます。
生成されたビルドスクリプトは、複数のプラットフォーム向けのディストリビューションを作成し、パッケージ化します。MPS には、Windows、MacOS、Linux 用のネイティブバイナリランチャーが含まれています。これらのランチャーは、スクリプトベースのランチャーよりも堅牢で便利な方法で MPS を起動できます。たとえば、アプリケーションをタスクバーやスタートメニューにピン留めすることができます。
ネイティブランチャーのアイコンをカスタマイズする
ビルドスクリプトウィザードは、適切に設定されたネイティブランチャーを含むビルドスクリプトを作成します。ビルドスクリプトで指定されたアイコンも適切に設定されます。ただし、Windows では、以下のアイコンをカスタマイズするために追加の作業が必要です。
タスクバー
タスク Bar のツールチップ
ファイルエクスプローラー
タスクスイッチャー
タスクマネージャー
カスタム IDE のネイティブランチャーを識別するために使用します。そうでない場合は、標準の MPS アイコンが表示されます。
Windows のファイルマネージャー、タスクマネージャー、その他前述の場所で使用されるアイコンは、Windows によって .exe ファイル自体から取得されます。タスクマネージャーで使用されるプロセスのテキスト説明も同様です。
rcedit ユーティリティは、.exe ファイル内のリソースを編集するために使用できます。Windows 上のすべての場所のアイコンを変更するには、rcedit ユーティリティを入手して次のコマンドを実行する必要があります。
$ rcedit mps64.exe --set-icon "path-to-ico"
ここで、mps64.exe はアイコンをカスタマイズする実行ファイルへのパスを指します。rcedit は github リポジトリ(英語)から取得できます。特に Windows 用の rcedit 実行ファイルはここから(英語)入手できます。
レガシービルドスクリプトにネイティブランチャーを追加する
MPS 起動スクリプト
ウィザードによって作成される 3 番目のビルドファイルは、MpsStartupScript のインスタンスです。IDE の起動方法を詳細に記述しています。
使用するブランド情報
ブースクラスパス
vm オプション

ビルドスクリプトの生成と実行
ビルドスクリプトにエラーがないと仮定すると、エラーを生成できます(モデルの再構築または Ctrl-F9)。これにより、各ビルドスクリプトの上部で定義されている名前が設定された 2 つの ant ファイルが作成されます。
この myBuild.xml (この場合)は、プロジェクトディレクトリに直接存在します。ファイルは、コマンドラインから(ant -buildfile myBuild.xml を使用して)実行することも、MPS 内から直接(プロジェクトエクスプローラーのビルドスクリプトのコンテキストメニューを介して)実行することもできます。

生成されたディレクトリ構造の確認
両方のビルドスクリプトを実行します。次の図は、ビルドスクリプトを実行した後のプロジェクト構造を示しています。特に、build/artifacts ディレクトリ内には、ビルドスクリプトのデフォルトのレイアウトセクションで定義された構造が作成されています。


ディレクトリとファイル構造を参照して、表示されているものをビルドスクリプトの定義に接続することをお勧めします。
JDK の設定
MPS を実行するには、JDK の設定が必要です。スタンドアロン IDE も同様です。理想的には、JetBrains JDK で実行する必要があります。これは MPS ディストリビューション(汎用版ではありません)の一部で、$MPS_HOME/jbr フォルダーにあります。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 でプロジェクトを開くと、開かれているプロジェクトの一部である有害なコードが実行される可能性があることをユーザーに警告するために、プロジェクトを信頼するダイアログがプラットフォームに追加されました。
MPS 2022.2 以降、MPS と MPS ベースのスタンドアロン IDE の両方で、2 ボタンのプロジェクトを信頼するダイアログが採用されています。ビルドスクリプトウィザードは、スタンドアロン IDE でこの新しいダイアログを有効にします。
スタンドアロンの MPS ベースの IDE でプロジェクトを信頼するダイアログを無効にするには、スタートアップビルドスクリプトまたは "vmoptions" 構成ファイルで -Didea.trust .disabled=true vm オプションを使用します。
関連ページ:
プロジェクトのセキュリティ
潜在的なセキュリティリスクを防ぐために、MPS では、プロジェクトのソースがわからない場合にプロジェクトを開く方法を決定できます。MPS は、オープニングプロセス中に実行されるタスクまたは構成について警告し、信頼できるソースを構成できるようにします。不明なソースからプロジェクトを開く:プロジェクトを開くと、MPS を使用すると、未知ソースコードを含むプロジェクトの処理方法をすぐに決定できます。プロジェクトを初めて開くたびに、IDE にプロジェクトを信頼ダイアログが表示されます。これは、プロジェ...
MPS 言語プラグインの構築
言語セットを作成し、それを対象ユーザーが利用できるようにしたいと考えています。このドキュメントでは、言語セットを、それらが依存するランタイムと一緒に、有効な MPS プラグインにパッケージ化する方法について説明します。注: MPS に付属の JavaExtensionsSample サンプルプロジェクトには、サンプルの Java 拡張機能をビルドしてプラグインにパッケージ化するための完全に機能的なビルドスクリプトが含まれています。そこからインスピレーションを受けることができます。出発点:あなた...
ブートストラップ依存関係の問題の除去
定義::いつでもそれ自体を使用する言語または、言語を使用し、その言語が機能するために同じソリューションを必要とする(つまり、間接的または直接依存する)ソリューション、ブートストラップ依存関係の問題があります。なぜこれが問題なのですか:ビルドスクリプトを使用してプロジェクト全体をゼロから再構築することはできません、生成されたアーティファクトを VCS リポジトリに保持する必要があります、このブートストラップ依存関係サークルは、プロジェクトが完全に一から再構築されることを防ぎます。代わりに、言語を...