2012-08-27 51 views
10

我有一個項目A取決於項目B.項目A有一些預構建任務依賴於項目B中生成的一些文件。當我構建Visual Studio,沒問題。但是,使用MSBuild.exe時,則表示有問題,因爲建造順序是:MSbuild構建命令問題 - 先構建步驟第一個或依賴項目第一個

  • A的預構建步驟< - 失敗,因爲B沒有被編譯
  • B被編譯< - 預計將執行第一
  • 一個編譯

是它使用的MSBuild預期的行爲? 有沒有辦法告訴MSBuild在A預構建步驟之前先做B?

我使用VS2010 C#和C++/CLI。我不認爲如果offeres額外的信息,但這裏是它是如何叫:

Running process (C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBUILD.exe "..\..\..\dev\build\MyProj.sln" /t:Clean /p:Configuration=Release;Platform=Win32) 
+0

'PreBuildEvent:'可以看出在Visual Studio中我的輸出窗口執行之前調用'Csc.exe'。在這個基礎上,我不明白這個問題。 –

+0

我不確定,但是您的問題類似於http://blogs.msdn.com/b/visualstudio/archive/2010/12/21/incorrect-solution-build-ordering-when-using-msbuild-exe .aspx? –

+0

@ P.Brian.Mackey Building VS解決方案和MSBuild.exe是獨立的進程。 –

回答

8

簡短的回答

刪除您生成事件,並添加類似以下到您的項目(.csproj的) :

<Target Name="AfterResolveReferences"> 
    <Exec Command="echo helloworld" /> 
</Target> 

更多信息

你可以閱讀有關customi在這裏演示構建過程:http://msdn.microsoft.com/en-us/library/ms366724%28v=vs.110%29.aspx

Before Build事件在ResolveReferences之前觸發,因此如果您引用的項目尚未在涉及項目的BeforeBuild事件時生成,那麼您的BeforeBuild事件將失敗。

爲了克服這個問題,您應該使用不同的入口點來定製構建過程。在上面的例子中,我使用AfterResolveReferences,因爲這將確保您引用的所有項目都已經構建完成。

6

傑克的答案似乎正在工作,但我不喜歡它的是VS編輯.csproj的支持本身並不支持在VS UI中, 除了難以理解的「卸載項目,編輯項目(在此期間你不能像平時那樣點擊你的文件),Reload project「模型。 我想要的是預構建事件在構建相關項目後觸發,並且在VS中與MSBuild中的工作相同。 在解決了這個問題之後,我發現了一個適用於MSBuild 4.0的解決方案。

無論我嘗試了什麼,我都無法更改PreBuildEvents目標以在依賴項目完成構建之後觸發。所以我做了什麼,而不是 是禁用PreBuildEvents目標,並創建一個將在適當的時間運行bastardized定製PreBuildEvents目標:

<ItemGroup> 
    <ProjectReference Include="..\YourProjectPath\YourProject.csproj"> 
    <ReferenceOutputAssembly>false</ReferenceOutputAssembly> 
    </ProjectReference> 
</ItemGroup> 
<Target Name="PreBuildEvent" AfterTargets="" BeforeTargets="" /> 
<Target Name="BastardPreBuildEvent" AfterTargets="ResolveReferences" BeforeTargets="CoreResGen"> 
    <Exec Command="$(PreBuildEvent)" /> 
</Target> 
+1

這適用於我。我同意...這樣好多了,因爲它仍然支持Visual Studio PreBuild編輯器對話框。 –

+0

這是'AfterTargets ='「BeforeTargets =''是否阻止PreBuildEvent運行在以前的位置?或者僅僅是您的沒有子元素? – user145400

+0

最有可能的是,將AfterTargets和BeforeTargets設置爲空白禁止運行PreBuildEvent目標。 – VeeTheSecond

相關問題