パラメータ(Parameters フォルダの外出し、リロード)
App_Data/Parameters 配下の JSON ファイル群の扱いを楽にする 2 つの方法をまとめます。
Env.jsonのParametersPathで、Parameters フォルダをリポジトリの外に置けます。/admins/reloadparametersにアクセスすると、再起動せずにパラメータを再読み込みできます。拡張ナビゲーションメニューに登録するとワンクリックで実行できます。
Parameters フォルダを外出しする
本体コードを開発するとき、環境固有の Parameters フォルダが本体リポジトリの配下にあると管理が面倒です。プリザンターにはフォルダを外に出す機能が組み込まれています。
Env.json を作成する
Implem.Pleasanter/App_Data/Parameters の配下に Env.json を作成し、外出しした Parameters フォルダのフルパスを指定します。
{
"ParametersPath": "D:\\Pleasanter\\Parameters"
}外出ししたフォルダを Git リポジトリにするなどして、チームで共有できます。
Env.json は環境固有のファイルなので本体リポジトリから除外すべきですが、本体の .gitignore に既に含まれているため、利用者側での除外設定は不要です。
実装
- Parameters 配下の JSON は
Implem.DefinitionAccessor/Initializer.csでまとめてロードされ、その中で Env.json が読み出されます(読み取り処理は 同ファイルの Read、マップ先は Env.cs)。 ParametersPathには 既定値がセット されており、Env.jsonのParametersPathに有効な値があれば 上書き されます。
再起動せずにパラメータを再読み込みする
公式マニュアルの FAQ プリザンターを再起動せずにParametersフォルダ配下の情報を再読み込みしたい にある機能です。注意事項もあるので、マニュアルをよく確認してください。
特権ユーザーでログインした状態で次の URL にアクセスすると、パラメータが再読み込みされます。
https://pleasanter.example.com/admins/reloadparameters特権ユーザーの設定が必要
この URL を使うには、事前に Security.json の PrivilegedUsers に対象ユーザーの LoginId を登録しておく必要があります。PrivilegedUsers の変更自体は再起動しないと反映されないため、初回は再起動してください。
{
"PrivilegedUsers": ["Administrator"]
}成功すると真っ白な画面に遷移するため、ブラウザの「戻る」で元のページに戻る必要があります。
確認したソースでは、この URL は再読み込みの成否にかかわらず常に空の文字列を返します。再読み込みは特権ユーザー(context.HasPrivilege)のときだけ行われ、特権ユーザーでなければ何もせずに同じ空の応答を返します(AdminsController.cs、ParametersInitializer.cs)。真っ白な画面が出ても再読み込みされたとは限らないので、特権ユーザーでログインしているかを確認してください。再読み込みでは Parameters 配下の JSON と拡張機能(ExtensionInitializer)を読み直します。起動時に一度だけ行う登録(SAML の認証スキームなど)はやり直さないため、そうした設定は再起動が必要です。
URL はどこにもリンクがなく入力も手間なので、次のようにメニュー化すると便利です。
拡張ナビゲーションメニューに追加する
ナビゲーションメニューの SettingsMenu に「特権管理 > パラメータリロード」を追加します。特権ユーザーでないと実行できないため、UserIdList で表示するユーザーを限定しています(例は UserId 1)。
{
"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 で特権ユーザーだけに見せているのはこのためです。
$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 の場合)。
{EnvironmentName}_Rds_SaConnectionString、{EnvironmentName}_Rds_ConnectionString(Service.jsonのEnvironmentNameを設定したとき)Implem.Pleasanter_Rds_{Dbms}_SaConnectionString(例:Implem.Pleasanter_Rds_PostgreSQL_SaConnectionString)Implem.Pleasanter_Rds_{Dbms}_ConnectionStringImplem.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)」を参照してください。
関連ページ
- CodeDefiner
- パラメータを差分の JSON だけで持つ(設計メモ)
- Operations Tools と SQL デバッガー(同じ手法で Operations Tools へのメニューを追加)
- 認証(Google Workspace の SAML SSO / SMTP の OAuth)