2012-04-16 173 views
0

我們有一個Silverlight,基於WCF RIA的大型解決方案,在我的桌面上與VS2010一起構建得很好。但是,TFS服務器上,我們看到了以下內容:Silverlight,WCF RIA構建失敗與TFS MSBuild

ViewModels\MyVM.cs (47): The type 'TestService.Web.SystemAccount' exists in both 
'd:\Builds\1\MyProduct\Binaries\Silverlight\TestService.dll' and 'd:\Builds\1\MyProduct 
\Binaries\Silverlight\CommonService.dll' 

..和...

Generated_Code\TestService.Web.g.cs (37476): The type 'TestService.Web.GroupToRule' in 
'd:\Builds\1\MyProduct\Sources\Source\UI\TestService\Generated_Code\TestService.Web.g.cs' 
conflicts with the imported type 'CommonService.GroupToRule' in 'd:\Builds\1\MyProduct 
\Binaries\silverlight\CommonService.dll'. Using the type defined in 'd:\Builds\1\MyProduct 
\Sources\Source\UI\CommonService\Generated_Code\CommonService.Web.g.cs'. 

所有很高興直到開發檢查上週末(不幸中的一個非常大的檢查) 。我們查看了變更集中發生了什麼變化,但沒有發現任何內容。

我們正在使用類似於此questionhere中提到的方法,因此我們有一個預構建解決方案來避免RIA代碼生成過程可以引入的循環引用。

我們懷疑構建順序已被修改並正在檢查中,但任何人都可以提出一些診斷步驟或解決方案嗎?

回答

0

我們解決了什麼是根本原因(我們認爲,至少它現在用TFS上的MSBuild編譯)。

我們有自己的DomainServiceFactory來創建WCF RIA域服務實例。在這個工廠內部,我們使用自定義對象(假設用戶已經登錄並且域服務需要經過認證的用戶)向當前已認證的用戶注入。另外,我們還有其他服務使用的通用域服務。

好吧,設置場景。

在這個混亂中的罪魁禍首看起來是我們用來表示經過身份驗證的用戶的自定義對象。不知何故,我們已經得出了編譯的情況,即這個對象是從常見域服務和其他域服務中看到的,這些域服務引用了常見域服務。

解決方案是通過使用服務定位器將通用域從需要它的服務中分離出來。

0

基於給定的信息,很難說任何合理的東西。

清潔如果您確信一切都被一些變更之前建立了良好的,你可以得到原木建造的是「好」的修訂和以後的「壞」的修訂並加以比較。一個好的差異工具可能有助於完成這項任務。一些分析工具,可能是手寫的,可能是必要的,因爲MSBuild日誌可能非常冗長。

另外,請查看您引用的主題中的this answer。這個建議可以被認爲是官方的建議,因爲來自MSBuild團隊的人在他們的一個博客中提出了相同的建議。