2010-04-16 80 views
11

大約一年前,一個類似的問題被問及並得到了回答,但要麼是一個不同的問題(一切都處於測試階段)或被誤診。它位於:MSbuild task fails because "Any CPU" solution is built out of order爲什麼Tfs2010在其他任何東西之前構建我的Wix項目?

我的問題是我有一個wix安裝程序項目,並且在星期一升級到Tfs2010後,生成鏈接失敗,因爲它無法在項目中找到Wpf應用程序的生成產品。經過一番挖掘,這是因爲它還沒有建成。 Vs2010中的建築正常工作。 wix項目設置爲依賴於Wpf項目,並且在IDE中查看Project Build Order時,一切看起來都很正常。

該問題最初是在解決方案中只有兩個平臺定義時遇到的; x86和x64。也有兩種風格,Debug和Release,並且TFSBuild.proj被設置爲構建所有四種組合。任何地方都沒有AnyCPU出現。根據上面提到的問題,我嘗試將Wpf項目更改爲使用AnyCPU,以便首先構建它。此時,wix項目使用了確切的配置,而Wpf項目使用AnyCPU的風格。但是,這樣做似乎沒有改變任何事情。

我正在使用Tfs2010 RTM,Vs2010 RTM和最新版本的Wix,它們在撰寫本文時是從2010-04-02開始的3.5.1602.0。任何其他人遇到這個?

2010-04-27:相當程度的挖掘,並再現克隆VM構建機器上後,我相信我知道發生了什麼事情,也什麼是失敗,但我不太知道如何解決它。

情況是,該錯誤似乎表現出基於解決方案文件中純粹繪製運氣的項目排序的症狀。看起來好像解決方案文件只是盲目地按照它們出現的順序構建項目,依賴於它能夠檢測未構建的引用並在需要時按需構建它們。

在我特別的解決方案文件中,我的Wix項目是在我的Wpf應用程序項目之前訂購的。這導致Wix項目首先被構建,並且正確地檢測到對Wpf項目的依賴關係,但實際的MSBuild任務因爲未定義的$(BuildProjectReferences)變量而被忽略,我提到了這篇文章主要文章中的一些評論線。由於MSBuild的詳細程度仍然在診斷之中,所以BuildProjectReferences可以看作是未定義的構建Wix項目,並且在構建Wix項目的任務中構建Wpf項目時可以將其定義爲true。然而,在測試時,它會再次評估未定義的任務,並且Wix構建失敗,因爲它無法找到未構建的Wpf項目的構建輸出。

因此,底線:因爲$(BuildProjectReferences)變量不正確而跳過了項目依賴關係。有趣的是,這個變量只存在於Wix2010.targets文件中,而不存在於wix.targets中;我想這就是爲什麼在安裝Tfs2010和Vs2010後才顯示出來。

解決方案:如何確保BuildProjectReferences正確傳遞到後續的MSBuild任務?有什麼特別的變量範圍正在進行?

2010-09-14:在WiX工具集中出現此問題的一個錯誤:http://sourceforge.net/tracker/?func=detail&atid=642714&aid=2990231&group_id=105970並在前一段時間修復。希望這不再是一個問題。如果是這樣,請打開一個新的錯誤。


爲了直接解決您的評論,我的解決方案中沒有任何內容在其構建文件中具有AnyCPU配置。我創建了AnyCPU配置,僅用於測試我的原始帖子中鏈接到的線程建議的解決方案。在它不起作用後,我再次刪除了AnyCPU配置。

此外,項目位於相同的解決方案文件中,但在單獨的解決方案文件夾(接口文件夾,安裝程序文件夾)中(如果有的話)。有趣的是,我打算製作一個小型沙盒示例,以便我可以說明我遇到的問題,但是在創建我的小樣本解決方案後,我無法獲取重現的錯誤。這讓我想,也許這是使用從Tfs2008團隊項目升級的團隊項目而不是在Tfs2010中創建的團隊項目的結果。如果我無法弄清楚測試解決方案的工作原理,我可以嘗試將我的項目分支到一個新項目中來測試這個理論。

p.s.另外,我是新來的stackoverflow - 如果「回答你自己的問題」工作流只是爲了提供具體的答案,爲什麼地球上的評論長度有限?


所以我把構建冗長達到診斷和今天通讀一遍,尤其是一線站出來對我說:

Task "MSBuild" skipped, due to false condition; ('@(_ProjectReferenceWithConfiguration)'!='' and '$(BuildingInsideVisualStudio)' != 'true' and '$(BuildProjectReferences)' == 'true' and '@(_MSBuildProjectReferenceExistent)' != '') was evaluated as ('..\WpfApp\WpfApp.csproj'!='' and '' != 'true' and '' == 'true' and '..\WpfApp\WpfApp.csproj' != ''). 

這被看作是我的安裝項目試圖建立我的wpf項目,因爲wpf項目被引用。特別是,出於某種原因,$(BuildProjectReferences)正在評估爲'',當我確信它應該是'真實的'。

在日誌中但是前面,在MSBuild任務的WpfApp項目開始時,我看到了這一點:

Task "MSBuild" (TaskId:15) 
... 
Initial Properties: 
... 
BuildProjectReferences = true 

所以財產確實是正確的,直到任務的開始,但隨後被顯然被覆蓋?我不清楚這些屬性是如何設置的。

+0

我遇到了同樣的問題,但仍未能解決它。 – 2010-04-21 13:56:05

+0

我已經做了一些研究。從頭開始重新創建解決方案似乎可行,我認爲這可能與訂單項目添加到解決方案中有關。這是純粹的猜測,雖然... – 2010-04-21 14:56:47

+0

編輯原始問題描述與更多信息。 – bwerks 2010-04-27 19:35:10

回答

4

繼Rob Mensching編輯我原來的帖子之後,似乎這確實已經在最新的WiX 3.6.0917.0中得到了修復。

1

TFS使用一組屬性來控制要構建的解決方案和配置的名稱(遍歷)。對於解決方案和配置的每個組合,它隨後使用項目依賴性/構建順序來控制構建項目的順序。有可能您的EXE/DLL是AnyCPU,並且您的WiX是x86,並且雖然WiX對EXE/DLL有依賴關係,但x86是在您的AnyCPU之前構建的。或者,他們甚至可能採用不同的解決方案,所以如果沒有查看源代碼就很難說清楚,但基本上它是如何工作的。

16

它的一個錯誤,一個錯誤,一個錯誤。不知道誰是負責任的,但這裏有一個工作骯髒的骯髒的黑客:

  1. 在記事本中打開您的.sln文件。
  2. 在項目列表中找到您的wix項目。
  3. 剪掉它們,在所有其他項目列出後粘貼回來。
  4. 在淋浴時哭泣,因爲你試圖擦洗髒衣服,只有幾個小時後出現,摩擦生,仍然與惡臭的惡臭緊緊地像你的屍體的皮膚。
+0

是的,我自己試圖想出一個簡單的複製場景(其目的實際上是在此處發佈代碼),但我毫不猶豫地稱其爲解決方案。 「哦,所有其他我依賴的項目*都已經建成了嗎?真糟糕!」 是的,這完全糟透了。然而,這是迄今爲止我在這個網站上得到的最好迴應,呵呵。 – bwerks 2010-05-01 00:24:09

+0

感謝您的解決方法。 – 2010-06-03 17:53:20

+0

@Nich奇怪的是,當我遇到與另一個解決方案相同的錯誤時,我不得不重新學習這個骯髒的黑客攻擊。再來一次,我會拍下它。 – Will 2010-06-03 23:29:02

1

我們所做的是首先report the bug to wix然後我們發現你的問題。

我們通過說,默認情況下,wix項目將建立引用,我們解決了問題。我們更新了文件C:\ Program Files \ MSBuild \ Microsoft \ WiX \ v3.5 \ wix2010。通過在設置路徑的項目中設置<BuildProjectReferences>True</BuildProjectReferences>來實現目標。所以,是的,我們手動完成了這個工作。我們已經報告了該錯誤以及我們的修復程序。

3

我看到這個問題(wix 3.7找不到依賴項目輸出)在我的本地和TFS構建(VS2010和VS2012)。

我終於通過將msbuild屬性/m:1設置爲只使用一個構建過程來解決它。我設置了/m以允許msbuild找出它可以用來同時構建多少個進程。

+1

不是最好的解決方案(因爲我想追蹤錯誤),但是我遇到過的唯一有效的解決方案。 TFS2013/wix3.8有同樣的問題,這有幫助。 – 2014-05-15 12:30:19

+0

ps忘了補充:一直在瀏覽論壇很多小時,這兩個線程可能是我的救生員,但他們不是:http://blogs.msdn.com/b/msbuild/archive/2010/12/21/incorrect -solution-build-ordering-when-using-msbuild-exe.aspx?CommentPosted = true#commentmessage and http://social.msdn.microsoft.com/Forums/vstudio/en-US/dc5b35a3-655f-4329-8da4 -50f21153a9a2 /預生成事件,似乎對運行在最錯誤的時間?論壇= tfsbuild – 2014-05-15 12:37:34

0

我今天面臨着一個同樣的問題,找到這樣一個解決方案:

在記事本中打開您的解決方案文件中找到你的安裝項目,並更改項目後設置。這將告訴msbuild這個項目應該等待另一個項目的構建。我不知道爲什麼,但它不是默認添加的。

Project("{GUID}") = "MyInstaller", "MyInstallerPath", "{Installer Project GUID}" ProjectSection(ProjectDependencies) = postProject {Prebuild Project GUID} = {Prebuild Project GUID} EndProjectSection EndProject

「預生成項目GUID」是你要安裝的項目的權數。

相關問題