在将解决方案升级到.NET Framework 4.5之后,每日部署停止工作。

6
我们一直在使用来自TFS2010的msdeploy每天更新我们的开发网站,取得了成功。但是当我们将应用程序从.NET Framework 4.0升级到4.5,ASP.NET MVC从3.0升级到4.0,并升级到VS2012后,它停止起作用了。看起来所有的内容都已经部署,但实际上什么也没有被部署。
我已经研究了两天,不知道为什么会出现这种情况,现在我已经没有任何想法了。
以下是我的构建脚本的一部分,它在升级之前一直在运行。
<MSBuild
                Projects="$(SolutionRoot)\My.Web\My.Web.csproj"
                Properties="MvcBuildViews=False;AllowUntrustedCertificate=True;AuthType=Basic;Configuration=Dev;CreatePackageOnPublish=True;DeployIisAppPath=dev.myweb;DeployOnBuild=True;DeployTarget=MsDeployPublish;MSDeployPublishMethod=WMSvc;MsDeployServiceUrl=https://10.xxx.xxx.xxx:8172/MsDeploy.axd;UserName=UserName;Password=Password;UseMsdeployExe=True"
                ContinueOnError="False"
                />

当升级开始并发现我的问题时,我们正在使用Web Deploy 2.0,但现在我们已经升级到Web Deploy 3.0。我还确保我们正在使用ToolsVersion="4.0"进行构建。
更新--
msbuild.exe /p:AllowUntrustedCertificate=True /p:AuthType=Basic /p:Configuration=Dev /p:CreatePackageOnPublish=True /p:DeployIisAppPath=dev.myweb /p:DeployOnBuild=True /p:DeployTarget=MsDeployPublish /p:MSDeployPublishMethod=WMSvc /p:MsDeployServiceUrl=https://10.xxx.xxx.xxx:8172/MsDeploy.axd /p:UserName=UserName /p:Password=Password /p:UseMsdeployExe=True E:\Builds\1\WhatEver\Daily_Build\Sources\My.Web\My.Web.csproj
现在,我也尝试从我们的TFS运行上述msbuild命令,但没有响应,这让我完全沮丧。无论详细程度如何,都没有任何东西在TFS的事件日志中,也没有日志文件...有什么想法吗?
直接使用msdeploy像下面这样是有效的;
<Exec Command="&quot;C:\Program Files\IIS\Microsoft Web Deploy V3\MSDeploy.exe&quot; -verb:sync -source:contentPath=&quot;E:\Builds\1\WhatEver\Daily_Build\Sources\My.Web\My.Web.csproj&quot; -dest:contentPath=&quot;E:\dev.my.web&quot;,computername=https://10.xxx.xxx.xxx:8172/MsDeploy.axd,username=UserName,password=Password,authtype=Basic -allowUntrusted=True"
              ContinueOnError="false" />

--

更新2 -- 似乎微软增加了一项检查,以确定哪些项目是可发布的项目,而我们的Web应用程序不是,因为输出类型为类库。这在v4.0中是有效的,但显然在v4.5中不再行得通。

有没有想法让它重新工作?我需要改变项目类型吗?预先创建发布包,然后部署它?还是其他什么方法?

--

还有其他人遇到过同样的问题吗?你找到了解决方案可以分享吗?

MSBuild的版本可能存在问题吗?


很遗憾,它只是默默地没有发生。实际上,有一些反馈会真正有所帮助。即使使用诊断详细程度,构建文件中也没有任何内容。 - Per
1
在msbuild输出中是否出现对msdeploy.exe的调用? - Richard Szalay
如果你还需要帮助,请告诉我,这样我就可以直接和你合作。 - Sayed Ibrahim Hashimi
@Sayed,我找到了一个解决方法,就是构建并将发布推送到文件系统。然后,调用目标“Package”,使用XmlPoke更新SetParameters.xml文件,最后使用MSDeploy将包部署到我的远程服务器。这真的是正确的做法吗?之前我使用过一体化的构建和部署方式,非常整洁。 - Per
@Per 我已经回答了这个问题。 - Sayed Ibrahim Hashimi
显示剩余2条评论
3个回答

6
这是我的建议。在VS2012中,我们通过创建发布对话框来创建发布配置文件,从而轻松自动化发布Web项目。在您的情况下,请创建一个新的MSDeploy配置文件。创建该配置文件时,我们将保存设置到Properties\PublishProfiles(或VB的My Project\PublishProfiles)文件夹下。此文件的扩展名为.pubxml。这些文件实际上是MSBuild文件,如果需要,可以进行自定义。您也可以继续使用发布对话框。密码将存储在.user文件中,并进行加密,只有您可以解密。
创建配置文件后,如果正在生成.sln文件,则可以使用以下命令进行发布。
msbuild mysoln.sln /p:DeployOnBuild=true /p:PublishProfile=<ProfileName> /p:Password=<Password>

如果你正在构建.csproj/.vbproj,那么你需要进行以下调整:
msbuild mysoln.sln /p:DeployOnBuild=true /p:PublishProfile=<ProfileName> /p:Password=<Password> /p:VisualStudioVersion=11.0

更多有关为什么需要 VisualStudioVersion,请参见http://sedodream.com/2012/08/19/VisualStudioProjectCompatabilityAndVisualStudioVersion.aspx

完成此操作后,您将能够像以前一样构建和发布。值得注意的是,我们已经在 Azure SDK 中为 VS2010 提供了所有这些新的 Web 发布功能。https://www.windowsazure.com/en-us/develop/net/#

另外,在您的问题中,我注意到您正在指定一些自定义属性,例如 MvcBuildViews。如果您愿意,现在可以直接将这些属性放置在发布配置文件(.pubxml 文件)中。当然,如果对于您的情况更合理,您仍然可以通过命令行传递它们。

更多信息请参见http://sedodream.com/2012/06/15/VisualStudio2010WebPublishUpdates.aspx

如果您看一下我们为开发人员自动发布的方法,就会发现我们要指定属性和目标来执行构建。这种方法的问题在于,它限制了我们增强 Web 发布体验的能力。在新版本中,我们引入了一个抽象概念——发布配置文件,它允许我们更改 Web 发布管道的底层目标,而您的自动化脚本将继续运行。希望从此时起,您不必再次回顾这个问题。


谢谢。我已经阅读了你在sedodream上的很多博客文章 :-)。如果我有机会在当前客户端部署到任何服务器,我想我早就走上了msdeploy配置文件的道路。不幸的是,我被阻止从我的PC进行操作,所有的努力都需要通过我们的TFS进行试验和错误,这对于使用msbuild和msdeploy来说是一种痛苦。 - Per

2
今天我也遇到了同样的问题。我正在尝试使用没有安装Visual Studio 2012的机器自动部署.NET 4.5 Web应用程序。然而,我的情况有一些细微的差别:我使用的是TeamCity而不是TFS,并且我们的解决方案是使用.NET 4.5创建的,而不是从.NET 4.0升级的。
尽管如此,我确实遇到了描述中的相同问题。我使用MSBuild来构建Web应用程序并将其部署到IIS,方式与之前在我的开发机器上所做的类似。这种方法在我的开发机器上运行良好。然而,在CI服务器上运行MSBuild时,它很高兴地构建了Web应用程序,但在那之后就停止了:没有错误,没有警告,什么都没有,只是一个构建成功的消息。没有任何迹象表明尝试将应用程序部署到IIS。
看来MSBuild缺少执行Web部署所需的相关目标。修复方法是将文件夹C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\Web从我的开发机器复制到CI服务器上,并将其复制到CI服务器上与我的机器上相同的位置。
一旦我这样做了,MSBuild就抱怨需要Web Deploy 3.0,但这很容易解决。在CI服务器上安装后,MSBuild就可以愉快地部署Web应用程序了。

那不会引起许可问题吗? - leppie
@leppie:我不确定,但我倾向于说不需要。您肯定不需要完整的VS2012许可证即可获得这些MSBuild目标,因为它们作为VS2012 Express for Web的一部分安装。此外,“Web”文件夹并不是我必须复制到服务器的唯一文件夹:即使在“VisualStudio\v11.0”文件夹中没有“WebApplications”文件夹,MSBuild也可以在CI服务器上编译Web应用程序。 - Luke Woodward

0

为了扩展Luke Woodward的答案

我也发现将C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\Web\从我的本地计算机部署到构建服务器上是解决办法。

然而,真正的解决办法是在 VS 2012 安装中安装 Microsoft Web Developer 工具,这将创建此文件夹和其他内容。这解决了Ieppie的许可异议。

我通过以下方式进行了测试...

  1. 删除C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\Web\
  2. 运行 VS 2012 安装程序并添加 MS Web Dev 工具。
  3. 验证安装后是否恢复了C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\Web\

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接