一个软件发布上去,最难的不是把文件传过去,是让那份配置文件在目标机器上变成能跑的样子。站点要连数据库,数据库那串连接里有数据源、库名、账号、密码,这些机器不知道,得人填。

这套东西的答案是模板加占位符。工作目录下有一批配置模板文件,里面写的是待替换的占位符,执行前把参数逐个塞进去,替换完再写回真实路径。

(等价改写,名字换掉了)判定就这一段,数的是替换命中了多少处:

foreach (TemplateFile loader in loaders) {
    loader.ApplyParameters(settings, out var hits);
    total += hits;
}
if (expected - 1 > total) {
    Logger.Error("profile template keywords do not match exactly");
    MarkFailed();
    return false;
}

命中数少于预期,模块直接判失败,进度条走成红色,后面那步覆盖根本不执行。这个校验是把错误挡在覆盖之前的一道闸,是我愿意留着的设计。

参数只认几个键

界面上填的东西最后都收进一个参数集合,按名字取。数据库这块只有四个键:Database.DataSource、Database.UserId、Database.Password、Database.DefaultDBName。前三个用户自己填,第四个缺省是 master。

(等价改写,名字换掉了)连接串是按这四个键拼出来的,连连接池的参数也写死在里面:

return "Data Source = " + sender.DataSource + ";Initial Catalog = " + sender.DefaultDb + ";"
     + "User ID = " + sender.UserId + ";Password =" + sender.Password
     + ";Pooling=true;Max Pool Size=150;Min Pool Size=0;";

Max Pool Size 是 150,这个数没做成配置项,改它得动代码重新编译。当时大概考虑的是单机部署、连接不会太多,我到现在也没觉得这是个问题,只是想说清楚,想调这个值的人得自己改一行。

填错的时候,代价落在谁头上

模板里的占位符和实际填的参数对不上,只有两种可能,参数名字写错,或者模板文件被人动过。前者在界面上就能看出来,后者比较麻烦,比如有人为了省事直接把模板里的占位符删了,或者拿旧版本的模板覆盖了新的。

这时程序能做的是告诉你「模板关键字没对上」,然后停下。它不会自动去猜哪个参数该填哪个位置,也不会拿上一轮的值顶上。想要的灵活度可以自己加,只是加在第九步之前还是之后,得想清楚。

配套上还有一条规矩,配置模板不进升级包。制包的时候排除清单里写着模板文件名、WrapperConfig.xml,还有 .log、.old、.pdb 三种后缀。理由是模板属于本机的东西,跟着升级包一起分发出去,很容易在下一台机器上被当成待替换的模板再执行一遍。

首次启动那条也提一句,第一次打开会锁在设置页,必须先填一个有效的工作目录,其余模块才解锁。这一条是防呆,不是安全,谁都能绕过界面直接改 XML。

上一篇讲工程怎么分:十个工程,依赖只有一个方向。开发那几天的记录见 说一个「等多久才算久」的事 和 备份做了,却退不回去。

本篇是《部署器 · 开源记》第 3 篇,合集在 部署器 · 开源记。