VS构建含无效字段引用的报表失败,MSBuild却成功,求原因
这事儿的核心原因在于Visual Studio和MSBuild对SSRS报表的校验深度完全不一样:
Visual Studio里的报表设计器(比如SSRS的Report Designer)是为开发场景打造的,它在构建时会做全量的逻辑校验:不仅会检查报表XML格式是否合法,还会实际解析报表里的所有表达式,核对每个字段引用是否存在于数据集返回的结果集中。你报表里引用了不存在的字段,它立刻就能揪出来,抛出
rsFieldReferenceNotFound这类错误,直接阻止构建成功——这是为了帮你在开发阶段就把问题扼杀在摇篮里。而MSBuild默认情况下只做最基础的文件层面验证:它只是按照报表项目文件的指令,把报表文件打包或者处理,但不会去执行数据集查询、校验字段引用是否有效。只要你的报表XML结构没语法错误,MSBuild就会认为构建完成,哪怕里面藏着字段引用错误这种逻辑问题。
如果想让你的CI/CD部署作业(也就是用MSBuild的场景)也能检测到这类错误,让构建同步失败,可以试试这两个办法:
使用RS.exe工具(Reporting Services自带的脚本工具):写一个简单的RSS脚本,在MSBuild构建步骤之后调用它,让它加载报表并执行完整的逻辑校验。比如可以用类似这样的命令:
rs.exe -i ValidateReport.rss -s http://your-report-server/ReportServer -v ReportPath="$(SolutionDir)/YourReport.rdl"脚本里可以通过SSRS的API实现对报表定义的全量验证,一旦发现字段引用错误就返回非零退出码,让整个作业失败。
自定义MSBuild任务:扩展MSBuild的构建流程,加入专门的报表验证任务,调用SSRS的相关类库来做深度校验,把验证逻辑整合到构建过程中,这样只要报表有逻辑错误,MSBuild就会直接标记构建失败。
内容的提问来源于stack exchange,提问作者Dmitrij Kultasev

