2010-04-13 73 views
1

下面是一个与CC.NET预处理器公开的'define'和'include'功能组合相关的奇怪问题。我们正在运行CCNet 1.4.4.83,并且我们的ccnet.config文件经过了结构化和拆分,可以充分利用存储在主配置文件包含的子文件中的常见元素块;我们也打出核心项目定义成自己的包含文件太多,留下ccnet.config本质上是一系列包括这样的:CruiseControl.NET预处理器'include'异常

<cruisecontrol xmlns:cb="urn:ccnet.config.builder"> 
    <!-- Configuration root folder - defined so we can use it as a symbol instead of using slightly confusing relative paths --> 
    <cb:define ccConfigRootFolder="C:\CruiseControl.NET\Config"/> 

<!-- Globals - standard or shared build elements common to all projects --> 
<cb:include href="$(ccConfigRootFolder)\Globals\globals.xml" xmlns:cb="urn:ccnet.config.builder"/> 

<!-- CruiseControl.NET Configuration - refresh configuration if changed --> 
    <cb:include href="$(ccConfigRootFolder)\CCNet Configuration\ccnet_configuration.xml" xmlns:cb="urn:ccnet.config.builder"/> 

<!-- Project #1 --> 
    <cb:include href="$(ccConfigRootFolder)\Project1\project1.xml" xmlns:cb="urn:ccnet.config.builder"/> 

<!-- Project #2 --> 
    <cb:include href="$(ccConfigRootFolder)\Project2\project2.xml" xmlns:cb="urn:ccnet.config.builder"/> 
</cruisecontrol> 

这工作一种享受 - 预处理程序正确地包括和分析在globals.xml<define>元素(和递归地解析globals.xml中包含的其他文件),然后包含的项目(包含对这些定义的元素的引用)被正确解析。

要在试图减少失误打破了构建过程的可能性进一步细化ccnet.config,我们改变它看起来像这样:

<cruisecontrol xmlns:cb="urn:ccnet.config.builder"> 
    <!-- Configuration root folder --> 
    <cb:define ccConfigRootFolder="C:\CruiseControl.NET\Config"/> 

    <!-- Project 'include' element definition --> 
    <cb:define name="ProjectInclude"> 
     <cb:include href="$(ccConfigRootFolder)$(ccIncludePath)" xmlns:cb="urn:ccnet.config.builder"/> 
    </cb:define> 

    <!-- Include common gobal elements --> 
    <cb:ProjectInclude ccIncludePath="\Globals\globals.xml"/> 

    <!-- Project #1 --> 
    <cb:ProjectInclude ccIncludePath="\Project1\project1.xml"/> 

    <!-- Project #2 --> 
    <cb:ProjectInclude ccIncludePath="\Project2\project2.xml"/> 
</cruisecontrol> 

正如你可以看到,我们的嵌入式常见的,重复的,部分的'include'定义,然后用它来实现每个包含使用路径作为参数 - 这个想法是,未来的文件修饰符将不会有机会意外地忘记他们新包含的内容项目线(如预处理器URN);只要他们的xml文件存在并且他们获得了正确的路径,其余部分将在常见的include定义中处理。

唯一的问题是,这不起作用 - 出于某种原因,它看起来像globals.xml文件没有被正确解析(或甚至包括),因为项目包括后抱怨没有定义的元素;也就是说,对全局文件中定义的元素的引用似乎没有被“注册”,因为项目不能识别它们。

我们已经尝试从globals.xml中取出嵌套包含,并将它们直接包括在顶层,但无济于事。在项目中注释掉第一个令人讨厌的元素引用只会导致Validator抱怨下一个元素,并带有消息“预处理失败加载XML:引用未知符号XXXXX”。但是,如果我们将globals.xml的主体嵌入到ccnet.config中,则可以工作。虽然听起来很奇怪,但好像预处理程序完全无法解析globals.xml,但随后愉快地咀嚼项目文件,只是因为未定义全局引用而失败。

然而,如果是这种情况,那么验证器就会失败。当然,因为它无法正确解析项目XML,所以我们在'原始'或'已处理'选项卡中也没有任何内容。 CruiseControl.NET服务本身无法从无用的例外开始:

服务无法启动。 System.Runtime.Serialization.SerializationException: 类型 'ThoughtWorks.CruiseControl.Core.Config.Preprocessor.EvaluationException' 在大会 “ThoughtWorks.CruiseControl.Core, 版本= 1.4.4.83,文化=中立, 公钥= null'未被标记为 可序列化。服务器堆栈跟踪:在 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo。InitSerialize(对象 OBJ,ISurrogateSelector surrogateSelector,的StreamingContext 上下文,SerObjectInfoInit serObjectInfoInit,IFormatterConverter来 转换器,ObjectWriter objectWriter) 在 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize(对象 OBJ,ISurrogateSelector surrogateSelector,的StreamingContext 上下文,serObjectInfoInit serObjectInfoInit,IFormatterConverter来 转换器,ObjectWriter objectWriter) 在 System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(对象 图表,H EADER [] inHeaders, __BinaryWriter serWriter,布尔FCHECK)在 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Ser ...

所有的文件说,这应该工作,而且也没有任何提及在'define'中使用'include'时不兼容或不一致。所以我很难过,在这个阶段,任何见解或建议都会得到高度重视。

回答

1

我们正在解决这一问题的1.5版本(希望本月底结束) http://jira.public.thoughtworks.org/browse/CCNET-1865

与那种工作方面 鲁文·威廉姆斯

+0

嗯 - 这个问题(CCNET-1865)涉及CCNET 1.5.0 RC1,特别是最近1.5.x的版本(即,它在此之前,最近版本不是问题)。那么CCNET-1865的解决方案是否解决了自1.4.4.83(我正在运行的版本)以来存在的更深层次的问题,并且最近在1.5.x版本中加剧了这个问题呢?更重要的是,你是否声明为了让'include'机制按预期工作,我需要将我的1.4.4.83安装升级到1.5版RC? 1.4.4.83版本将没有回归补丁? – 2010-04-13 14:41:05

+0

嗨 1.4.4已经停产,所以不会有补丁。 你能给我你的配置文件,我会检查1.5是否正确解析它。你为什么不想升级到1.5? 它确实有很多新功能, 和在当前中继线(v1.6)我们有一个不同的预处理引擎(基于LINQ),所以更新1.4.4分支将会更少, 甚至更​​少有可能。 – Williams 2010-04-19 18:25:35

+0

嗯,为什么1.4.4停产?这是最新的'制作'版本 - 1.5只有CTP和RC1版本,因此尚未进入最终的'RTM'版本!这正是我为什么不将1.4.4服务器升级到1.5的原因,因为我有大约50个左右的1.4.4项目以及一些开发人员,他们会把我的脚趾从顶层窗户悬挂下来,如果我只是在他们的CI上放置了CC.Net的CTP或RC1版本服务器!失败的配置正是我在问题中发布的内容 - “定义”内的“包含”被异常解析。 – 2010-04-20 10:30:35