【问题标题】:Deployed dll file is not the one built by TFS部署的 dll 文件不是 TFS 构建的
【发布时间】:2016-04-26 13:48:46
【问题描述】:

我有一个最近开始表现得很奇怪的 TFS 2013 构建定义。它已经完成了一年多的工作,没有任何问题。

它构建了 4 个不同的项目。其中两个是 asp.net mvc/webapi 项目,它们也通过 msdeploy 部署到同一 QA 登台 Web 服务器上的两个独立网站。构建配置为使用 Release|Any CPU

当构建运行时,使用 ApplyVersionToAssemblys powershell 脚本设置 dll 版本。

在构建文件夹中,所有程序集都有正确的版本。但是在其中一个部署的网站中,其中一个 dll 文件“WebUI.dll”的版本号为 1.0.0.0,即与构建目录中的相同 dll 不同,即 4.0.buildnumber

部署的“WebUI.dll”似乎也是在 Debug 模式下构建的,因为某些按钮和操作仅在定义 DEBUG 时才会显示。

如果我从构建目录甚至 PublishedWebsites 目录复制构建的 WebUI.dll,一切都会按预期工作。

所以我的问题是 MSDeploy 如何通过 MSBuild 创建其“自己的”版本的 WebUI.dll? (不 - 在发布模式下未选中定义调试常量复选框)。在服务器上的任何地方都找不到 1.0.0 版本的 WebUI.dll,所以我猜它必须是在 msdeploy 运行时“创建”的?

(我最近所做的唯一更改是添加一个新的构建定义,它构建相同的解决方案并运行所有测试但不部署任何东西。)

更新:我尝试使用构建过程使用的相同发布配置文件从 VS 发布,并且按预期工作。部署的 WebUI.dll 是在发布模式下构建的。该版本未应用,因为它是构建过程的一部分,但重要的是它是部署的发布模式 dll,而不是构建过程进行部署时的调试。我还尝试创建一个 Web 部署包并将其安装在本地服务器上,结果相同。

所以问题仍然是构建过程中构建的 WebUI.dll 是正确的(发布模式和正确的版本控制) - 但是在构建服务器上的部署过程中被调试模式“替换”并且没有版本控制

更新 2;编译命令

C:\Program Files (x86)\MSBuild\12.0\bin\amd64\MSBuild.exe /nologo /noconsolelogger "C:\Builds\2\Products\SomeApp4.Main\src\SomeApp4\Main\Source\SomeApp4.Web.sln" /nr:False /fl /flp:"logfile=C:\Builds\2\Products\SomeApp4.Main\src\SomeApp4\Main\Source\SomeApp4.Web.log;encoding=Unicode;verbosity=normal" /p:SkipInvalidConfigurations=true /p:DeployOnBuild=true /p:PublishProfile=Chicago /p:AllowUntrustedCertificate=true /p:Password=bw /m /p:OutDir="C:\Builds\2\Products\SomeApp4.Main\bin\SomeApp4.Web\\" /p:Configuration="Release" /p:Platform="Any CPU" /p:VCBuildOverride="C:\Builds\2\Products\SomeApp4.Main\src\SomeApp4\Main\Source\SomeApp4.Web.sln.Any CPU.Release.vsprops" /dl:WorkflowCentralLogger,"C:\Program Files\Microsoft Team Foundation Server 12.0\Tools\Microsoft.TeamFoundation.Build.Server.Logger.dll";"Verbosity=Normal;BuildUri=vstfs:///Build/Build/740;IgnoreDuplicateProjects=False;InformationNodeId=14;TargetsNotLogged=GetNativeManifest,GetCopyToOutputDirectoryItems,GetTargetPath;LogProjectNodes=True;LogWarnings=True;TFSUrl=http://boston.SomeCompany.local:8080/tfs/SomeCompany;"*WorkflowForwardingLogger,"C:\Program Files\Microsoft Team Foundation Server 12.0\Tools\Microsoft.TeamFoundation.Build.Server.Logger.dll";"Verbosity=Normal;" /p:BuildId="abd7db3d-4ff8-43b4-ab36-f35c6f6e5697,vstfs:///Build/Build/740" /p:BuildLabel="SomeApp4.Main_4.0.6.740_20160121_103558" /p:BuildTimestamp="Thu, 21 Jan 2016 09:35:59 GMT" /p:BuildSourceVersion="LSomeApp4.Main_4.0.6.740_20160121_103558@$/Products" /p:BuildDefinition="SomeApp4.Main"

【问题讨论】:

  • 如果你从 VS 发布,你会得到相同的结果吗?您还可以尝试创建一个 MSDeploy 包并检查包内的文件版本。我假设您一直使用 PowerShell 脚本来设置 dll 版本?
  • 在回复您的评论的帖子中查看我的更新。是的 - 我一直使用相同的 powershell 脚本。那仍然有效。在构建服务器上构建的文件是正确的(带有版本控制的发布模式),但其中一个 dll 文件 WebUI.dll 在部署过程中被替换 - 但仅在构建过程中
  • 你能分享你的 msdeploy 命令吗?
  • 是 - 请参阅帖子中的更新 2
  • 我能给你的最好建议是开始选择构建/部署选项,直到找到导致问题的选项或相反:创建一个新构建慢慢添加完整构建测试的每个组件一路上

标签: tfs msbuild continuous-integration tfsbuild


【解决方案1】:

更改程序集版本时,源代码管理下的版本不会更改。您只能更改已在您的构建代理机器上复制的版本。如果 msdeploy 命令的源指向 TFS 中的项目,您将不会获得版本化程序集。

【讨论】:

  • 是的,我知道。并且所有程序集在 build 文件夹、drop 文件夹和 _PublishedWebsites 文件夹(包括 WebUI.dll)中都有正确的版本号。问题是文件何时在构建过程中部署。部署的 WebUI.dll 不是在构建中创建的,而是由调试模式 WebUI.dll 文件替换,我不明白如何/为什么?我怀疑 aspnet_compiler 并尝试在没有 BuildMvcViews 的情况下运行构建,但 WebUI.dll 仍然被替换
【解决方案2】:

我发现了问题。

构建定义构建了 4 个解决方案,其中一个是 WebUI(aspnet mvc) 解决方案,一个是 Api 解决方案 (asp.net WebApi)

在 Api 解决方案中,一个项目引用了 WebUI 项目,但 WebUI 项目不在 Api 解决方案中。

MSbuild 无论如何都解决了 WebUI 项目,因此没有错误,并且 api 解决方案的构建 + 部署工作正常。但是 WebUI 项目是在调试模式下构建的,因为我猜它在 Api 解决方案中没有解决方案配置

当 msbuild 运行带有部署标志的 api 解决方案时,它还设法部署了调试中内置的 WebUI 项目。

所以 WebUI 项目部署了两次。首先是 WebUI 解决方案中的正确的,然后是使用 Api 解决方案编译的错误调试 WebUI。

哇!这就是我要说的。

感谢你们的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 2013-07-15
    相关资源
    最近更新 更多