簡體   English   中英

MSbuild構建訂單問題 - 首先構建預先構建步驟或首先依賴項目

[英]MSbuild build order issue - pre-build steps first or dependent projects first

我有一個項目A取決於項目B.項目A有一些預構建任務依賴於項目B中的一些生成的文件。當我在Visual Studio中構建時,沒有問題。 但是當使用MSBuild.exe時,則存在問題,因為構建順序是:

  • A的預構建步驟< - 失敗,因為B尚未編譯
  • B編譯< - 預計首先執行
  • A是編譯的

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

我正在使用VS2010 C#和C ++ / CLI。 我不認為是否提供額外的信息,但這是如何被稱為:

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

簡短的回答

刪除構建事件,並在項目中添加以下內容(.csproj):

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

更多信息

您可以在此處閱讀有關自定義構建過程的信息: http//msdn.microsoft.com/en-us/library/ms366724%28v=vs.110%29.aspx

在ResolveReferences之前觸發Before Build事件,因此如果您在項目的BeforeBuild事件發生時尚未構建您引用的項目,則BeforeBuild事件將失敗。

要解決此問題,您應該使用不同的入口點來自定義構建過程。 在上面的示例中,我使用AfterResolveReferences,因為這將確保您已經構建了所引用的所有項目。

傑克的答案似乎有效,但我不喜歡的是,除了尷尬的“卸載項目,編輯項目(在此期間無法點擊”)外,VS UI中本身不支持編輯.csproj的支持你通常想要的文件,重新加載項目“模型。 我想要的是在構建依賴項目之后觸發預構建事件,並且在VS中和MSBuild中的工作相同。 在努力解決這個問題后,我找到了一個適用於MSBuild 4.0的解決方案。

無論我嘗試了什么,我都無法改變PreBuildEvents目標,以便在依賴項目完成構建后觸發。 所以我做的是禁用PreBuildEvents目標,並創建一個在適當的時間運行的私有自定義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>

這是一個相當老的問題,但我發現這個簡單的解決方案(它也可能適用於你)只需添加

<PreBuildEventDependsOn>ResolveReferences</PreBuildEventDependsOn>

之前

<PreBuildEvent>

不幸的是,這必須在編輯器中完成,VS編輯器不支持它(版本15.6.2)。

這可能是舊的,但我最近遇到了同樣的問題。 傑克的回答是我試圖使用的,但在Visual Studio中加載項目時會調用ResolveReferences目標,這對我來說很糟糕 ,因為我在目標期間做了一個相當長的過程,我只想在構建之前做。

我最終使用的解決方案類似於VeeTheSecond,但涉及的有點少:

<Target Name="BeforeBuild" DependsOnTargets="ResolveReferences">
    ... exec something using a dependant project's output exe ...
</Target>

這將強制BeforeBuild目標等待所有依賴項目實際構建完成,因此exec命令可以使用依賴項目的輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM