2013-02-04 45 views
0

我有一個使用命令行調用Visual Studio的devenv.exe構建項目的構建過程(我們稱之爲「引擎」)。我已經知道一段時間了,VS只是用MSBuild構建的,所以我終於開始更新引擎來直接使用MSBuild。但是,我發現MSBuild有一個奇怪的異常。MSBuild沒有將編譯的二進制文件複製到<app> bin

爲了討論,有項目A,B,C和D.項目A是我正在構建的一個主要項目,一個Web應用程序,它依賴於(通過項目引用)其他3個項目。當在VS中手動構建時,A\bin被組件填充。當與devenv.exeA\bin引擎內置時再次填充預期的二進制文件。當內置引擎使用MSBuild時,A\bin不包含任何內容。但是,B\Release\bin,C\Release\binD\Release\bin包含它們的二進制文件,因爲它們使用前兩種構建方法。

這隻發生在一個單一的項目中。這個問題似乎並不涉及依賴項目。

我試圖明確設置MSBuild OutDir屬性,但它似乎沒有任何影響。

我已經運行了診斷輸出的構建,並且看不到任何明顯的東西(當然,這裏有很多,所以有可能我還沒有找到重要的東西)。

我一直想弄清楚如何看到命令行調用MSBuild VS正在從devenv.exe運行時,但我似乎無法找到它。

我看過其他幾個SO帖子(herehere),但他們不是同一個問題。

任何人都知道這可能是什麼,或者我可以在哪裏尋找答案或更多診斷信息?

編輯1:用於調用的MSBuild的參數模式如下:

/nologo /target:Compile /property:Configuration=%%BUILDCONFIG%% /maxcpucount 
    /property:OutDir=%%OUTDIR%%\bin\ /verbosity:diag /detailedsummary "%%PROJPATH%%" 

的是,下半部分顯示了我的企圖迫使輸出目錄,以及增強的輸出顯示該過程的更多細節。構建引擎代碼替換爲具有正在構建的項目的適當替換值的「%% TOKEN %%」項。

編輯2:更多的研究和尋找到提供提示後,我決定放棄使用msbuild代替devenv的努力。看起來devenv在準備msbuild的號召之前還有很多事情要做,如果我沒有完全理解msbuild的入口,我可能會破壞其他事情。我確實嘗試瞭解是否記錄了從devenvmsbuild的呼叫,但它似乎不是。我已經考慮構建一個虛擬的msbuild應用程序來轉儲進入它的命令,並臨時換出實際的msbuild來生成這些診斷信息,但這比現在更值得付出。性能提升不是很大,現在值得追求。

+0

在命令行中,您是否明確提供了配置和平臺? Visual Studio總是這樣。這可能是因爲您的項目文件包含多個配置,並且您擁有在Visual Studio中選擇的其中一個。如果您沒有明確提供Platform/Config,MsBuild將僅使用默認值。 – jessehouwing

+0

是的,請參閱編輯1.應該包括那個... – Peter

+0

您在項目A的%% OUTDIR %%日誌中看到的值是多少,並且對於其中一個項目有效? – Alex

回答

0

我會看看你的項目屬性的生成選項卡上的輸出路徑。使用MSBuild和使用Visual Studio(甚至從命令行)時,有很多差異。它可能是你有A配置不同於B,C,D和同步A到其餘將使它工作。另外,如果您打算單獨構建項目,而不是解決方案,請確保不要使用解決方案級別宏,這些宏本身不會提供給項目文件。

+0

我簡化了對單個項目的測試,並且如原始帖子中所述,問題仍然存在。所以我相信這個問題與依賴關係無關。我檢查了輸出路徑。我不確定你在這種情況下可能會認爲錯誤。它被設置爲bin \,並且在VS IDE中構建並使用對devenv的CLI調用時工作得很好。只有在MSBuild中才​​能複製二進制文件。我沒有任何SLN宏。 – Peter

+0

他們都是四個人嗎?或者是其他3個不同的東西。 – Alex

+0

在幾個測試用例中,是的,項目都被配置爲輸出到'bin \'。然而,在這一點上,我已經減少了對單個獨立庫的測試,它們沒有引用任何東西,它仍然會發生。該模式似乎是將依賴項的二進制文件複製到「最頂級」項目下一層的依賴項目中。 – Peter

0

你應該設置OutputPath而不是OutputDir

由於您已經使用/verbosity:diag,爲什麼不將輸出重定向到文本文件並仔細分析csc.exe(或其他正在使用的編譯器)存儲二進制文件的位置?這對於您瞭解MSBuild如何在底層進行工作而言非常簡單和豐富。