【问题标题】:What's the event that Visual Studio 2008 does after post build event?Visual Studio 2008 在构建后事件之后会发生什么事件?
【发布时间】:2010-10-21 23:47:48
【问题描述】:

我只是创建了一个包含 3 个项目的解决方案。

按构建顺序排序

  1. Silverlight 应用程序,包含在 ASP.NET Web 应用程序项目的 /ClientBin 中

  2. Windows 窗体应用程序,用于在 Visual Studio 传递构建(构建后事件)时优化 /ClientBin 中的所有 xap。

  3. ASP.NET Web 应用程序在 /ClientBin 中显示 Silverlight 应用程序

当我成功构建 ASP.NET Web 应用程序时,Web 应用程序项目中的 ClientBin 目录包含 3 个 Xap 文件。之后VS.net 触发一个执行 Windows 窗体应用程序的构建后命令事件。 Windows 窗体从 3 个 Xap 文件中优化所有 Xap 和远程 2 个 Xap 文件。

最后,Vs.net 再次从 Silverlight 应用程序项目中复制 3 个 Xap 文件到 ClientBin 目录。为什么?我找不到任何关于在构建后事件后复制 Xap 文件的日志(通过使用 MSBuild 项目构建输出详细程度:诊断)

Target "PostBuildEvent" in file "C:\Windows\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets":
  Task "Exec"
    Command:
    **T:\myProject\Higgs\Higgs\Higgs.Utils.WinApp\bin\Higgs.Utils.WinApp.exe mode=OptimizeXap clientbindir=T:\myProject\Higgs\Higgs\Higgs.Web.UI\ClientBin\ mainxapfilename=Higgs.Silverlight.UI**
  Done executing task "Exec".
Done building target "PostBuildEvent" in project "Higgs.Web.UI.csproj".
Target "CoreBuild" in file "C:\Windows\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets":
  Task "CallTarget" skipped, due to false condition; ('$(UnloadProjectsOnCompletion)'=='true') was evaluated as ('false'=='true').
  Task "CallTarget" skipped, due to false condition; ('$(UnloadProjectsOnCompletion)'=='true') was evaluated as ('false'=='true').
  Task "CallTarget" skipped, due to false condition; ('$(UnloadProjectsOnCompletion)'=='true') was evaluated as ('false'=='true').
Done building target "CoreBuild" in project "Higgs.Web.UI.csproj".
Target "AfterBuild" in file "C:\Windows\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets":
Done building target "AfterBuild" in project "Higgs.Web.UI.csproj".
Target "Build" in file "C:\Windows\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets":
  Building target "Build" completely.
  No input files were specified.
Done building target "Build" in project "Higgs.Web.UI.csproj".
Target "AfterRebuild" in file "C:\Windows\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets":
Done building target "AfterRebuild" in project "Higgs.Web.UI.csproj".
Target "Rebuild" in file "C:\Windows\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets":
  Building target "Rebuild" completely.
  No input files were specified.
Done building target "Rebuild" in project "Higgs.Web.UI.csproj".

Done building project "Higgs.Web.UI.csproj".

更新

我通过构建 Windows 窗体应用程序更新了构建顺序。构建 Web 应用程序后。接下来,我使用 Windows Dorm 应用程序构建后事件来执行其 EXE。一切正常。但我不喜欢这个解决方案,因为它对我来说很奇怪。

【问题讨论】:

    标签: visual-studio silverlight msbuild build-process


    【解决方案1】:

    我假设这些项目相互引用?所以:

    • ASP.NET Web 应用至少引用 SilverLight 应用。
    • Win Forms 应用引用 Silverlight 应用。

    Visual Studio 会自动将依赖文件复制到项目层次结构中,除非您告诉它不要这样做。所以 Visual Studio 将采取的步骤是:

    1. 构建 SilverLight 应用程序,并将其输出复制到表单应用程序和 Web 应用程序
    2. 运行在 SilverLight 应用项目的“构建”选项卡中定义的任何构建后事件。
    3. 构建 Win Forms 应用程序,如果它被其他任何东西引用,请适当地复制输出。
    4. 运行在 Win Forms App 项目的“构建”选项卡中定义的任何构建后事件。
    5. 构建 Web 应用程序
    6. 运行在 Web 应用项目的“构建”选项卡中定义的任何构建后事件。
    7. 运行通过 MSBuild 定义的任何“构建后”事件。

    基本上,大部分相关动作发生在之前构建后事件:

    Task "FindUnderPath"
      Comparison path is "D:\Projects\PublicSites\WebTest".
      Path [...]
      [...]
    Done executing task "FindUnderPath".
    Task "FindUnderPath"
      Comparison path is "bin\".
      Path [...]
      [...]
    Done executing task "FindUnderPath".
    Task "FindUnderPath"
      Comparison path is "obj\Debug\".
      Path [...]
      [...]
    Done executing task "FindUnderPath".
    Task "RemoveDuplicates"
    Done executing task "RemoveDuplicates".
    Done building target "_CleanGetCurrentAndPriorFileWrites" in project
      "WebTest.csproj".
    Target "IncrementalClean" in file 
      "c:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets":
    Task "FindUnderPath"
      Comparison path is "bin\".
    Done executing task "FindUnderPath".
    Task "FindUnderPath"
      Comparison path is "obj\Debug\".
    Done executing task "FindUnderPath".
    Task "Delete"
    Done executing task "Delete".
    Task "RemoveDuplicates"
    Done executing task "RemoveDuplicates".
    Task "WriteLinesToFile"
    Done executing task "WriteLinesToFile".
    Done building target "IncrementalClean" in project 
      "WebTest.csproj".
    

    然后 build 和 AfterBuild 事件发生。

    我的猜测是 VS 注意到 SilverLight 应用程序的输出与其下的版本不同,因此去获取一个新副本。

    【讨论】:

    • 是的!我想是这样。如何禁用获取新副本到 ClientBin 目录?
    • 您能否让 Web 项目引用来自 Win Forms 项目而不是 SilverLight 项目的 XAP 输出?这样你会得到优化版本而不是原始版本?或者:让 Win Forms 应用程序优化 Client_Bin 文件夹中的 XAP,在构建 Web 应用程序之后,而不是之前。
    • 我应该创建自定义项目/解决方案来做到这一点。
    【解决方案2】:

    这并不能完全解决您的情况,但仅供参考,PostBuildEvent 似乎是构建过程的最后一步;您可以通过检查了解有关订购的更多信息

    c:\Windows\Microsoft.NET\Framework\v2.0.50727\Microsoft.Common.targets

    显示 msbuild 逻辑。

    【讨论】:

    • 但我认为所有 silverlight 应用程序项目在 web 应用程序项目构建完成后再次将所有 xap 复制到 clientbin。我不知道为什么。这很奇怪。 PS。我尝试在构建后事件完成之前通过 7-Zip(用于锁定文件)打开 xap 文件。但我在 VS.net 的控制台中找不到任何错误消息。
    【解决方案3】:

    我不知道你到底有什么问题,但如果对你的项目有任何依赖,你应该命令它们正确构建。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-11
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      相关资源
      最近更新 更多