部署的dll文件不是TFS构建的
Deployed dll file is not the one built by TFS
我的 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 时显示。
如果我从构建目录甚至 PublishedWebsites 目录复制构建的 WebUI.dll,一切都会按预期工作。
所以我的问题是 MSDeploy 如何通过 MSBuild 创建它的 "own" 版本的 WebUI.dll? (不 - 在发布模式下未选中 Define DEBUG constant 复选框)。在服务器上的任何地方都找不到版本 1.0.0 WebUI.dll 所以我猜它必须是 "created" 当 msdeploy 运行时?
(我最近所做的唯一更改是添加一个新的构建定义,它构建相同的解决方案并运行所有测试但不部署任何东西。)
更新:我尝试使用构建过程使用的相同发布配置文件从 VS 发布并且按预期工作。 WebUI.dll 部署是在发布模式下构建的。该版本未应用,因为它是构建过程的一部分,但重要的是它是部署的发布模式 dll,而不是调试,当构建过程执行部署时就是这种情况。我还尝试创建一个 web 部署包并将其安装在本地服务器上,结果相同。
所以问题仍然是构建过程中构建的 WebUI.dll 是正确的(发布模式和正确的版本控制) - 但在通过调试模式在构建服务器上部署期间得到 "replaced"并且没有版本控制
更新 2; Msbuild 命令
C:\Program Files (x86)\MSBuild.0\bin\amd64\MSBuild.exe /nologo /noconsolelogger "C:\Builds\Products\SomeApp4.Main\src\SomeApp4\Main\Source\SomeApp4.Web.sln" /nr:False /fl /flp:"logfile=C:\Builds\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\Products\SomeApp4.Main\bin\SomeApp4.Web\" /p:Configuration="Release" /p:Platform="Any CPU" /p:VCBuildOverride="C:\Builds\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"
当您更改程序集版本时,源代码管理下的版本不会更改。您只能更改已复制到您的构建代理机器上的版本。如果 msdeploy 命令的源指向 TFS 中的项目,您将不会获得版本化程序集。
我发现了问题。
构建定义构建了 4 个解决方案,其中一个是 WebUI(aspnet mvc) 解决方案,一个是 Api 解决方案 (asp.net WebApi)
在 Api 解决方案中,一个项目正在引用 WebUI 项目,但 WebUI 项目不在 Api 解决方案中。
MSbuild 无论如何都解决了 WebUI 项目,因此没有错误,api 解决方案的构建和部署工作正常。但是 WebUI 项目是在调试模式下构建的,因为它在 Api 解决方案中没有解决方案配置我猜
当 msbuild 运行 带有部署标志的 api 解决方案时出现问题,它还成功地部署了在调试中构建的 WebUI 项目。
所以WebUI项目部署了两次。首先是来自 WebUI 解决方案的正确解决方案,然后是使用 Api 解决方案编译的错误调试 WebUI。
呸!这就是我要说的。
感谢大家的帮助。
我的 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 时显示。
如果我从构建目录甚至 PublishedWebsites 目录复制构建的 WebUI.dll,一切都会按预期工作。
所以我的问题是 MSDeploy 如何通过 MSBuild 创建它的 "own" 版本的 WebUI.dll? (不 - 在发布模式下未选中 Define DEBUG constant 复选框)。在服务器上的任何地方都找不到版本 1.0.0 WebUI.dll 所以我猜它必须是 "created" 当 msdeploy 运行时?
(我最近所做的唯一更改是添加一个新的构建定义,它构建相同的解决方案并运行所有测试但不部署任何东西。)
更新:我尝试使用构建过程使用的相同发布配置文件从 VS 发布并且按预期工作。 WebUI.dll 部署是在发布模式下构建的。该版本未应用,因为它是构建过程的一部分,但重要的是它是部署的发布模式 dll,而不是调试,当构建过程执行部署时就是这种情况。我还尝试创建一个 web 部署包并将其安装在本地服务器上,结果相同。
所以问题仍然是构建过程中构建的 WebUI.dll 是正确的(发布模式和正确的版本控制) - 但在通过调试模式在构建服务器上部署期间得到 "replaced"并且没有版本控制
更新 2; Msbuild 命令
C:\Program Files (x86)\MSBuild.0\bin\amd64\MSBuild.exe /nologo /noconsolelogger "C:\Builds\Products\SomeApp4.Main\src\SomeApp4\Main\Source\SomeApp4.Web.sln" /nr:False /fl /flp:"logfile=C:\Builds\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\Products\SomeApp4.Main\bin\SomeApp4.Web\" /p:Configuration="Release" /p:Platform="Any CPU" /p:VCBuildOverride="C:\Builds\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"
当您更改程序集版本时,源代码管理下的版本不会更改。您只能更改已复制到您的构建代理机器上的版本。如果 msdeploy 命令的源指向 TFS 中的项目,您将不会获得版本化程序集。
我发现了问题。
构建定义构建了 4 个解决方案,其中一个是 WebUI(aspnet mvc) 解决方案,一个是 Api 解决方案 (asp.net WebApi)
在 Api 解决方案中,一个项目正在引用 WebUI 项目,但 WebUI 项目不在 Api 解决方案中。
MSbuild 无论如何都解决了 WebUI 项目,因此没有错误,api 解决方案的构建和部署工作正常。但是 WebUI 项目是在调试模式下构建的,因为它在 Api 解决方案中没有解决方案配置我猜
当 msbuild 运行 带有部署标志的 api 解决方案时出现问题,它还成功地部署了在调试中构建的 WebUI 项目。
所以WebUI项目部署了两次。首先是来自 WebUI 解决方案的正确解决方案,然后是使用 Api 解决方案编译的错误调试 WebUI。
呸!这就是我要说的。
感谢大家的帮助。