我有一个包含网站项目和几个持有支持类的项目的解决方案。每个项目都提供单独的基本功能:配置,数据,身份,业务对象等。当我在VS2008中打开解决方案时,它构建完美。它无需编译或JIT异常即可运行,运行,调试和体验。
在TFS 2010中生成自动构建定义后,构建将按顺序运行并编译所有子项目。它们都是针对“调试|混合平台”的,因为我读到的文档试图追踪我的错误表明这对于网站项目是必要的。我可以在构建日志中看到所有新编译的库和所有第三方库都被复制到\Binaries
目录和网站的\bin
目录中。然后日志中的下一行是:
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_compiler.exe -v /MySolution -p ..\MySolution\ -u -f -d -fixednames D:\TFS\b\308\Binaries\_PublishedWebsites\MySolution\
D:\TFS\b\308\Sources\MySolution\SomeFolder\SomePage.aspx.vb(15): error BC30456: 'MyProperty' is not a member of 'Some_UserControl_ForPage'. [D:\TFS\b\308\Sources\Solution Files\MySolution.sln]
Done Building Project "D:\TFS\b\308\Sources\Solution Files\MySolution.sln" (default targets) -- FAILED.
Build FAILED.
"D:\TFS\b\308\Sources\Solution Files\MySolution.sln" (default target) (1) ->
(MySolution target) ->
D:\TFS\b\308\Sources\MySolution\SomeFolder\SomePage.aspx.vb(15): error BC30456: 'MyProperty' is not a member of 'Some_UserControl_ForPage'. [D:\TFS\b\308\Sources\Solution Files\MySolution.sln]
用户控件的相关属性属于“祖父母”继承。控件本身在业务对象库中继承自定义WebUserControl。该类继承自具有此基本属性的不太具体的WebUserControl。当代码行被注释掉时,错误会发生变化,但这只是在构建链上发生的另一个“不可能”的错误。
我们还有其他网站项目在所有框架2.0+中成功自动构建和部署此构建代理。当我更改构建定义的各种属性(工作空间等)或在解决方案本身中调整构建的配置时,它不会产生行为变化。构建完成后,所有成功构建的项目最终都在构建文件夹中。此外,该解决方案还包含第二个不太复杂的网站项目,该项目成功构建并最终位于构建文件夹的_PublishedWebsites文件夹中。
答案 0 :(得分:1)
第一个课程是取消选中Use fixed naming and single page assemblies
设置网站属性。这消除了物理错误。这是来自同事而非计算移动的赃物,但我最好的猜测是由于某种原因TFS无法解析嵌套引用。虽然这消除了引用错误,但它会出现一个新错误,指示用户控件上的模糊名称空间。我们的假设是,由于网站项目不再局限于单页集,因此可能会生成多个副本(为什么超出我),这会导致模糊不清。
我不完全理解这个解决方案的细节,但是在this blog article by Aaron Hallberg中读到了这个问题,我知道编译器之间存在差异,因为它在IDE和编译器中运行在自动构建代理上运行。为了总结他的响应,IDE自动不会为网站的MSBuild注入-u。但是,由于TFS只考虑解决方案而不是考虑网站项目,因此它会查找设置Debug.AspNetCompiler.Updateable
。如果启用此设置,则可能会导致控件上的命名空间不明确。我不明白为什么和阅读他的博客文章没有清楚任何事情。
取消选中网站属性页面中的Allow this precompiled site to be updated
,可以使网站正常构建,并且由于它不是预编译网站,因此对构建没有任何负面影响。