如何编译依赖自动生成代码的BIMLScript?解决编译矛盾
这个问题确实挺头疼的——当你在BIML里编写ScriptComponentSource的脚本代码时,IDE会因为找不到自动生成的Output0Buffer类和UserComponent基类方法而报错,但这些类其实会在SSIS包生成时自动创建。下面是几个实用的解决办法:
1. 添加临时类定义(兼顾设计时兼容)
在你的main.cs代码开头加入带条件编译的临时类,让BIML IDE能识别这些类型,同时完全不影响SSIS运行时的真实代码逻辑:
#if !SSIS_RUNTIME // 临时定义仅用于BIML设计时的语法检查,SSIS运行时会自动生成真实类 public class UserComponent { protected Output0Buffer Output0Buffer; public virtual void CreateNewOutputRows() {} } public class Output0Buffer { public void AddRow() {} public string UUId { get; set; } public string Surname { get; set; } public string GivenName { get; set; } public string EmailAddress { get; set; } public string UPN { get; set; } } #endif
编写BIML时,IDE会读取这些临时定义,不再报找不到类型的错误;当SSIS实际运行脚本时,SSIS_RUNTIME会被自动定义,这些临时代码会被忽略,转而使用SSIS生成的真实类。
2. 忽略设计时错误(快速临时方案)
如果只是IDE显示红色波浪线,但实际生成SSIS包后脚本能正常编译运行,那可以直接忽略这些设计时的错误。因为BIML在生成包时,会先创建OutputBuffer的定义,再编译你的脚本代码,运行时逻辑是完全正常的。这个方法最简单,但开发体验稍差。
3. 使用Varigence BimlStudio
如果你目前用的是免费的Visual Studio BIML扩展,升级到Varigence的BimlStudio可以彻底解决这个问题。BimlStudio对<ScriptComponentProject>有深度原生支持,能自动识别你在<OutputBuffers>中定义的列和结构,实时提供代码提示,不会出现这类虚假的编译错误。
4. 提取脚本到外部文件
把main.cs的内容保存为独立的外部文件,然后在BIML中通过外部引用的方式加载:
<File Path="main.cs" External="true" />
这样IDE可能不会对外部文件做严格的语法检查,你也可以在外部文件中单独添加临时类定义,保持BIML主代码的整洁性。
内容的提问来源于stack exchange,提问作者TGlatzer

