如何在Structurizr中使用!include引入多个文件构建工作区
Structurizr DSL多文件引入的正确实现方式
核心问题分析
你之前的报错大概率是因为外部DSL文件包含独立的model块,同时主文件在workspace块内直接引入这些文件——Structurizr DSL要求一个工作区只能有一个顶级model块,重复定义会引发语法冲突。extends只能单文件扩展的限制确实没法满足多文件拆分需求,改用!include的正确姿势是把外部文件作为主文件model(或views)块的内容片段,而非独立的完整DSL文件。
正确文件结构示例
假设你的文件都放在同一目录下:
main.dsl(主文件,负责顶层工作区、模型、视图的框架)teste2.dsl(外部文件,存放部分软件系统/容器定义)teste3.dsl(外部文件,存放剩余组件/关系定义)
主文件 (main.dsl) 写法
主文件需要完整包裹workspace块,在model(或views)内部使用!include引入外部文件的内容片段:
workspace "My Multi-File Workspace" { model { // 引入外部模型定义文件 !include teste2.dsl !include teste3.dsl // 主文件内也可直接补充全局元素或关系 endUser = person "终端用户" endUser -> OrderSystem "提交订单" } views { // 视图定义可集中在主文件,也可拆分到外部文件后用!include引入 systemLandscape { include * autoLayout } } }
外部文件 (teste2.dsl) 写法
不要写独立的model块,直接写模型元素的定义即可:
// 直接定义软件系统和容器 OrderSystem = softwareSystem "订单系统" { OrderService = container "订单服务" { OrderApi = component "订单API组件" } }
外部文件 (teste3.dsl) 写法
同样直接写元素或跨文件的关系定义:
// 定义另一个软件系统和依赖 InventorySystem = softwareSystem "库存系统" { InventoryDb = container "库存数据库" } // 跨文件的组件关系直接定义即可 OrderSystem.OrderService.OrderApi -> InventorySystem.InventoryDb "查询库存"
额外注意事项
- 如果需要拆分视图定义,同样可以在主文件的
views块内用!include引入外部视图文件,外部视图文件直接写视图内容(不需要views块包裹)。 - 若外部文件不在当前目录,可使用相对路径(比如
!include ./models/teste2.dsl)或绝对路径。
内容的提问来源于stack exchange,提问作者user29715992
相关产品推荐
相关产品推荐

