オープン部分とクローズド部分のインターフェース
RenMori はオープンコアの構成をとっています。オープンソースの renmori コマンドラインツールは統合の起点であり、設定の解析、出力先とバックアップの準備、ユーザー向けの処理フローの制御を担い、ベースラインコンテナ形式を常に同梱しています。強力な保護(ビルドごとの多態化エンジン、実行時の鍵導出、ネイティブコアとランチャー)はクローズドプラグインに含まれ、ビルド済みのコンポーネントとして配布され、ソースとして配布されることはありません。
このページでは、両者の間の安定したプロセス契約を定義します。この契約は、オープンソースのツールとクローズドプラグインがそれぞれ独立してバージョン管理とリリースを行えるように公開されており、クローズドなのはプラグインの実装のみです。
検出
オープンソースのツールは、次の順序でプラグインを探します。
renmori protectの--plugin <path>引数- 環境変数
RENMORI_PLUGIN - プラグインが見つからない場合:ツールはベースライン形式で実行し、ベースライン以外の
strengthはすべて拒否する
<path> には実行ファイル、またはオープンソースのツールが現在の Python インタープリタで実行する .py スクリプトを指定します。プラグインが使用されるのは capabilities のハンドシェイク(後述)が成功した場合のみで、ハンドシェイクに失敗したプラグインは存在しないものとして扱われ、ベースラインの経路がとられます。
現在の CLI は、上記の明示的なパスに加えてローカルキャッシュも確認し、必要に応じて公開リリースからプラグインをダウンロードし、SHA256SUMS で検証してキャッシュに保存します。strength が未設定の場合のデフォルトはフル保護で、利用可能なプラグインがなければ実行は失敗します。--strength auto はプラグインがない場合にベースラインへフォールバックし、--strength baseline はプラグインを一切ダウンロードしません。保護強度とクローズドプラグインを参照してください。
通信方式
各呼び出しは短時間で終了する 1 つのサブプロセスであり、最初の引数で操作を選択します。リクエストが必要な場合は stdin 上の単一の JSON オブジェクトとして渡し、レスポンスは stdout 上の単一の JSON オブジェクトとして返します。人が読むためのログはすべて stderr に出力するため、stdout は常に機械で解析可能な状態に保たれます。終了コードは成功時に 0、失敗時に 0 以外です。フィールド名と列挙値はすべて ASCII で、ロケールに依存しません。
リクエストとレスポンスのオブジェクトはいずれも整数のフィールド interface を持ちます。オープンソースのツールは自身が対応する最も高いバージョンを送信し、そのバージョンが capabilities に含まれていないプラグインは拒否します。
操作
capabilities
リクエスト本体はありません。プラグインは自身を説明する JSON オブジェクトを出力し、終了コード 0 で終了します。
protect
stdin で渡すリクエストオブジェクトは次のとおりです。
プラグインは source_dir を output_dir にコピーし、すべてのアセットと Ren'Py スクリプトを多態化されたコンテナに格納し、対象プラットフォームごとのネイティブコア(要求された場合はランチャーも)を同梱し、ランタイムの拡張を書き込み、格納した平文の元ファイルを削除したうえで、stdout に次のレスポンスオブジェクトを出力します。
失敗した場合、プラグインは {"interface": N, "status": "error", "message": "<reason>"} を出力し、0 以外の終了コードで終了します。オープンソースのツールはそのメッセージを報告して実行時エラーの終了コードで終了し、可能な限り不完全な output_dir を残さないようにします。
責任の分担
- オープンソースのツールが担うもの:引数と
renmori.tomlの解析、出力先とバックアップの決定およびそれに伴うコピーや移動、事前の概要表示と確認、レスポンスから書き出すビルドマニフェスト、そしてローカライズされたすべての出力 - プラグインが担うもの:コンテナ形式とそのビルドごとのランダム化、鍵導出、ネイティブコアとランチャー、そして
output_dir以下のディスク上の最終的な結果
インプレース保護は、プラグインに対しては単純な source_dir → output_dir の組として表現されます。オープンソースのツールはまず元のビルドを別の場所(バックアップ、または後で破棄する一時ディレクトリ)に移し、元のパスを output_dir として渡すため、プラグインがインプレースのモードを持つ必要はありません。
バージョン管理と完全性
interface は、リクエストまたはレスポンスの形式に互換性のない変更があった場合にのみ増加します。プラグインは複数のバージョンに同時に対応でき、オープンソースのツールは両者が共通して対応する最も高いバージョンを選択します。任意のフィールドを追加するだけの変更では、バージョンは上がりません。
プラグインが生成したビルドは、第三者がオープンなフレームワークと自作の弱いエンジンで組み立てたビルドと区別できるようにすることを意図しています。ビルドマニフェストには、ランタイムが検査するビルドフィンガープリントを含めることができます。この紐付けはクローズドのコンポーネントと共に定義されるものであり、この公開された契約の対象外です。