fsword's blog

A blogging framework for hackers.

持续集成中的缺环-4

| Comments

昨天我用了很罗嗦的语言解释了一个简单的 DSL 例子,这是为了方便讲述后面的内容,那个例子是典型的“麻雀虽小,五脏俱全”,回想起来,它至少包含了这么几样——

* 一个 DSL 解释脚本(dsl.rb)
* 一个装载脚本(run.rb)
* 使用 DSL 编写的文件(myapp)

这么继续演化下去,我们就会得到一个比较详细的实现方案。

不过,考虑到复杂性的增加,我们现在应该考虑一点设计了,比如代码的层次和结构。

代码如何组织呢?这是一个脚本为中心的项目,因此我们决定不使用unix那种传统的/usr, /bin, /etc 方案,而是直接把所有代码都放在一个目录下,这样比较方便清理,不用专门的打包工具。

首先很容易想到,我们需要普通的 config 目录;其次,考虑到我们会引入很多 profile 文件,所以建立一个专门的profile目录似乎也是很必要的;另外,作为脚本性质的项目,一定要有明确的调用入口,我们建立一个 script 目录用于存放直接执行用的脚本。

接下来是 lib 目录,我们应该把代码分开,做好高內聚和低耦合(这个没忘吧,脚本也要注意这些原则哦),因此一开始会是这样——

目录结构

看起来不错,但是用代码稍一尝试就发现了一些问题,主要是lib目录。

  • 没有考虑到外部服务的耦合,我们使用的系统服务应该是松耦合在这个体系中的,比如虚拟机分配系统,在淘宝这样的环境中,虚拟机分配系统可能有多种方案,随着业务和组织结构的变化,我们有可能需要切换不同的分配系统。
  • 应用专用的目录没有办法去落实,实际上,DSL的方案决定了我们不会为某个应用做特殊化,我们要做的是各种服务的组装。
  • 与capistrano相比,profile的设计显然有些僵硬,后续可能需要调整,当然,这样演化出来的可能是一个工具包,但是目前也想不清楚,我们把决策延后,暂时先不管它。

经过设计和编码的迭代,目前是这样的:

目录结构

这并不是最后的结论,大家知道,设计和开发往往是交替进行的。不过无论如何,现在可以接着前进了

Comments