Skip to content

パラメータ(Parameters フォルダの外出し、リロード) ​

第6版作成 最終更新 (日本時間)
確認バージョン1.5.8.1

App_Data/Parameters 配下の JSON ファイル群の扱いを楽にする 2 つの方法をまとめます。

  • Env.json の ParametersPath で、Parameters フォルダをリポジトリの外に置けます。
  • /admins/reloadparameters にアクセスすると、再起動せずにパラメータを再読み込みできます。拡張ナビゲーションメニューに登録するとワンクリックで実行できます。

Parameters フォルダを外出しする ​

本体コードを開発するとき、環境固有の Parameters フォルダが本体リポジトリの配下にあると管理が面倒です。プリザンターにはフォルダを外に出す機能が組み込まれています。

Env.json を作成する ​

Implem.Pleasanter/App_Data/Parameters の配下に Env.json を作成し、外出しした Parameters フォルダのフルパスを指定します。

json
{
    "ParametersPath": "D:\\Pleasanter\\Parameters"
}

外出ししたフォルダを Git リポジトリにするなどして、チームで共有できます。

Env.json は環境固有のファイルなので本体リポジトリから除外すべきですが、本体の .gitignore に既に含まれているため、利用者側での除外設定は不要です。

実装 ​

再起動せずにパラメータを再読み込みする ​

公式マニュアルの FAQ プリザンターを再起動せずにParametersフォルダ配下の情報を再読み込みしたい にある機能です。注意事項もあるので、マニュアルをよく確認してください。

特権ユーザーでログインした状態で次の URL にアクセスすると、パラメータが再読み込みされます。

text
https://pleasanter.example.com/admins/reloadparameters

特権ユーザーの設定が必要

この URL を使うには、事前に Security.json の PrivilegedUsers に対象ユーザーの LoginId を登録しておく必要があります。PrivilegedUsers の変更自体は再起動しないと反映されないため、初回は再起動してください。

json
{
    "PrivilegedUsers": ["Administrator"]
}

成功すると真っ白な画面に遷移するため、ブラウザの「戻る」で元のページに戻る必要があります。

確認したソースでは、この URL は再読み込みの成否にかかわらず常に空の文字列を返します。再読み込みは特権ユーザー(context.HasPrivilege)のときだけ行われ、特権ユーザーでなければ何もせずに同じ空の応答を返します(AdminsController.cs、ParametersInitializer.cs)。真っ白な画面が出ても再読み込みされたとは限らないので、特権ユーザーでログインしているかを確認してください。再読み込みでは Parameters 配下の JSON と拡張機能(ExtensionInitializer)を読み直します。起動時に一度だけ行う登録(SAML の認証スキームなど)はやり直さないため、そうした設定は再起動が必要です。

URL はどこにもリンクがなく入力も手間なので、次のようにメニュー化すると便利です。

拡張ナビゲーションメニューに追加する ​

ナビゲーションメニューの SettingsMenu に「特権管理 > パラメータリロード」を追加します。特権ユーザーでないと実行できないため、UserIdList で表示するユーザーを限定しています(例は UserId 1)。

json
{
 "TargetId": "SettingsMenu",
 "Action": "Append",
 "NavigationMenus": [
  {
   "ContainerId": "PrivilegedSettingsContainer",
   "MenuId": "PrivilegedSettingsMenu",
   "Name": "特権管理",
   "Icon": "ui-icon ui-icon-gear",
   "ChildMenus": [
    {
     "MenuId": "PrivilegedSettings_ReloadParameters",
     "Name": "パラメータリロード",
     "Icon": "ui-icon ui-icon-arrowrefresh-1-w",
     "Url": "javascript:$p.naviMenuExtendParameterReload();",
     "UserIdList": [
      1
     ]
    }
   ]
  }
 ]
}

実処理は拡張スクリプトに切り出します。リロード URL を Ajax で呼び出し、成功したら画面をリロードするかどうかを確認します。前述のとおり特権ユーザーでなくても応答は成功(空の文字列)になるため、done に入っても再読み込みされたとは限りません。メニューを UserIdList で特権ユーザーだけに見せているのはこのためです。

js
$p.naviMenuExtendParameterReload = function() {
 $.ajax({
  type: "get",
  url: "/admins/reloadparameters",
 }).done(function() {
  if (window.confirm('パラメータを再ロードしました。画面リロードを行いますか? ')) {
   location.reload();
  }
 }).fail(function(jqXHR, textStatus, errorThrown) {
  window.alert(`パラメータの再ロードに失敗しました。ステータス:${jqXHR.status}`);
 });
}

2 つのファイルを拡張ナビゲーションメニュー・拡張スクリプトの所定のフォルダに置き、プリザンターを再起動するとメニューが表示されます。

ナビゲーションメニューに追加された「特権管理 > パラメータリロード」

読み込みのしくみ ​

起動時の Initializer.SetParameters() は、Parameters の JSON をクラスごとに Read<T>() で読み込みます(Initializer.cs#L93-L198、Initializer.cs#L339-L354)。

  • ほとんどのパラメータは必須(required: true)です。ファイルが無ければ ParametersNotFoundException、JSON として読めなければ ParametersIllegalSyntaxException で起動できません。
  • Env・BackgroundJobs・Quartz・MultiTenant・Scim・PleasanterExtensions などは任意(required: false)で、ファイルが無くても起動します(MultiTenant・Scim・PleasanterExtensions は既定のインスタンスになります)。
  • JSON に書かれていない項目は、C# のクラスの初期値になります。Script の ServerScript = true・ServerScriptTimeOut = 10000 のように初期値が書かれた項目もありますが、Api・Security などのクラスには初期値が無く、0・false・null になります。配布されている JSON は全項目が書かれているため、実質的な既定値は JSON の値です。Rds は読み込んだあと Dbms が空なら SQLServer にします(Script.cs#L8-L12、Rds.cs#L19-L23)。

Rds.json の接続文字列が空のときは、環境変数を次の順で探します(SA の例。Owner / User も同じ形で、Service.json の Name が既定の Implem.Pleasanter の場合)。

  1. {EnvironmentName}_Rds_SaConnectionString、{EnvironmentName}_Rds_ConnectionString(Service.json の EnvironmentName を設定したとき)
  2. Implem.Pleasanter_Rds_{Dbms}_SaConnectionString(例: Implem.Pleasanter_Rds_PostgreSQL_SaConnectionString)
  3. Implem.Pleasanter_Rds_{Dbms}_ConnectionString
  4. Implem.Pleasanter_Rds_SaConnectionString、Implem.Pleasanter_Rds_ConnectionString

MySqlConnectingHost も {EnvironmentName}_Rds_MySqlConnectingHost / Implem.Pleasanter_Rds_MySqlConnectingHost から補えます。Dbms 自体を環境変数で指定する仕組みはなく、Rds.json の Dbms で決まります。

画面から変更した差分(Parameters テーブル) ​

1.5.8.1 には、パラメータの一部を画面から変更し、ファイルとの差分を DB の Parameters テーブル(ParameterId・Title・Body)に保存する仕組みがあります。ParameterSetting.json の EnableScreenManagement を true にすると、特権ユーザーだけがパラメータの編集画面(ParametersController の Edit)を使えます。EnableRestart を true にすると、特権ユーザーは画面から再起動(2 秒後に StopApplication())も要求できます。どちらも配布時は false です(ParameterSetting.json、Permissions.cs#L717-L720、Permissions.cs#L764-L768、ParametersController.cs#L62-L79)。

図を読み込み中…

  • 編集画面で保存すると、ファイルから読み込んだ値と編集後の JSON を比べ、違いを op・path・value の配列(JSON Patch の形)で Body に保存します。違いが無ければ空です。クラスに無い項目名を書くとエラーになります(ParameterModel.cs#L617-L641、Jsons.cs#L41-L79)。
  • 起動時と /admins/reloadparameters のたびに、PatchParameters() がパラメータ名ごとに Parameters テーブルの Body を読み、ファイルの値に適用します。DB に接続できないなどで読めなければ、ファイルの値のままです(Initializer.cs#L325-L336、Initializer.cs#L364-L469)。
  • Security の PrivilegedUsers は、ファイルの配列と差分適用後の配列の和集合になります。ファイルに書いた特権ユーザーは、画面からは外せません。
  • Env・ParameterSetting・Rds・Migration などは patch: false で読み込まれ、画面の差分の対象になりません。

ファイルを書き換えても、DB の差分は残ったまま上から当たります。ファイルと画面の両方で同じ項目を変えている場合は、画面(DB)の値が勝ちます。

バージョンアップのときに旧環境のパラメータを引き継ぐ CodeDefiner merge の動きと注意点は CodeDefiner の「パラメータの引き継ぎ(merge)」を参照してください。

関連ページ ​

変更履歴

第6版記事の確認版を繰り返す表現を整理する
第5版「パラメータ(Parameters フォルダの外出し、リロード)」にスクリーンショットを追加
第4版CodeDefiner のデータベース作成・更新とパラメータの引き継ぎ、画面でのパラメータ管理、MCP エンドポイントのブラウザアクセスの解説と、関連する改修・設計メモを追加
第3版「構築・運用」を 1.5.8.1 のソースで検証して修正
第2版記事のファイル名に並び順の番号を付け、元記事リンクを frontmatter の sources に移行
第1版「構築・運用」セクションの記事を追加