MSBuild DeployOnBuild=true未发布

43

我有一个使用Visual Studio 2010 MVC2构建的Web应用程序,我正在使用Hudson命令行构建它。 我想让Hudson发布Web输出,所以我在我的命令行中添加了DeployOnBuild=true和CreatePackageOnPublish=True标记。

我的命令是:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe 
   /target:Clean,Build 
   /property:Configuration=Debug;DeployOnBuild=True;CreatePackageOnPublish=True; 
   [my project name.csproj]

在我的开发机(Windows 7)上运行这个命令可以成功将Web输出发布到\obj\Debug\Package\PackageTmp\。但是在Hudson服务器(WS 2008)上运行此命令编译成功,但不会发布。同样的命令,同样版本的MSBuild,同样的源代码。
我尝试了/t:Publish目标,但像其他人的帖子中看到的一样,它给我一个"Skipping Unpublishable Project"的响应。
我还尝试将DeployOnBuild=TrueCreatePackageOnPublish=True标签添加到我的项目文件中,但没有任何改变。
对于为什么它没有发布,您有什么想法吗?我是否使用这些标签不正确?我确定这里有些东西我没有看到。

3
你最后解决了这个问题吗?我现在也遇到了同样的困境。 - Michael Hallock
我将TeamCity迁移到了一台新服务器,但是超过50个项目的所有Web应用程序构件都是空的zip文件。正常的服务和测试应用程序构建得很好...我已经尝试解决这个问题超过24个小时了;( - Piotr Kula
4个回答

42
假设您的Hudson服务器上没有安装Visual Studio 2010,则可能缺少发布“目标”文件。经过很多次尝试后,我终于解决了这个问题。
相当长一段时间以来,我知道需要将我的本地机器上带有VS2010的目录 C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\WebApplications 拷贝到我的服务器上才能让项目生成。但是要使项目发布也需要将以下目录拷贝到服务器上: C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web 注意:在我的情况下,我实际上会将这些文件夹提交到源代码管理中,并更改我的csproj文件中的<MSBuildExtensionsPath32>值,指向这些已检出的文件夹(这样预备服务器时就少了一步)。虽然这不是必要的,但在解决问题后,您可能想考虑这一点。
更新:所以在我完成上述步骤后,生成报错"Microsoft.Web.Deployment.dll"未找到。为了解决这个问题,我需要在服务器上安装Microsoft Web Deploy v2.0,即使我仅发布到文件系统也是如此。我猜我可以理解这个逻辑。
更新:我发现通过IIS Web平台安装程序安装“Visual Studio 2010 Shell(集成)”将安装所需的生成目标。这似乎是在服务器上不安装整个Visual Studio应用程序和不手动从开发机器复制看似随意的文件夹之间取得的一个不错的折衷方案。

2
我已经做了这个,但仍然得到相同的结果。DeployOnBuild 仍然被忽略了。 - Michael Hallock
我尝试了Web Deploy 3.0 RC,效果非常好!谢谢。 - Filippo Vitale
更新不再正确:安装VS 2013 Shell(集成版)不会在MSBuild安装下提供所需的“Web”文件夹。 - Søren Boisen
非常感谢您。您为我节省了很多时间。到处都是关于需要 WebApplication 文件夹的信息,但没有人提到过 Web 文件夹。我的 Jenkins 编译总是没有错误地结束,但总是忽略发布。 我的 Visual Studio 解决方案包括一个服务、几个项目和一个 WebApp,现在终于使用 /p:VisualStudioVersion=12.0 /p:DeployOnBuild=true /p:PublishProfile=ProfileName 在本地文件系统上简单地发布,而不需要对 .pubxml 文件进行任何更改。 再次感谢! - AndreaT
这个位置是否已经改变了msbuild 14.0?尽管安装了Visual Studio 2017,但我在本地看不到那个web文件夹,但是webapplications是存在的。 - b15
如果您已经在本地安装了Visual Studio 2017+,则需要从'C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\VisualStudio\v15.0\Web'复制Web文件夹。 - b15

3
似乎无法满足运行发布目标的条件。
1)您可以有不同的发布路径。
2)运行发布目标的条件为假。
要验证这两个条件,请使用标志 /v:diag 调用您的命令。搜索 "Target 'Publish'" 并尝试找出真正发生了什么。它将类似于:
Target "ExecuteT4Templates: (TargetId:144)" in file "D:\App\App.csproj" from project "D:\App\App.csproj":
Skipping target "ExecuteT4Templates" because all output files are up-to-date with respect to the input files.
Input files: D:\App\App.exe\\App_Config\Configuration.tt;D:\App\App.exe\\App_Config\Debug.App.tt;obj\\Debug.t4lastbuild
Output files: D:\App\App.exe\\App.config
Done building target "ExecuteT4Templates" in project "App.csproj".: (TargetId:144)

1
感谢您提供/v:diag的想法。我认为我们越来越接近了。即使软件包部署成功,似乎也没有触发“发布”目标。两个输出之间有所不同的第一个迹象是,在可以正常工作的机器上,提到了以下设置。这非常接近输出的开头: _CreatePackage = True _DeployOnBuild = True _PackageTempDir = obj\Debug\Package\PackageTmp在此之前,两个输出没有明显的区别。对于触发这些设置的条件,您有什么想法吗? - awright

1
根据Brian Hinchey的答案,我发现我还需要在我的msbuild批处理调用中附加额外的参数VisualStudioVersion,以便在构建代理(在我的情况下是TeamCity)上调用正确版本和路径到Microsoft.WebApplication.targets。 如果没有此参数,则Web部署和发布步骤将无法完成,并且我的批处理将成功完成并返回代码0,使分析变得非常困难 - 即使使用/verbosity标志附加到“debug”构建。 SAYED IBRAHIM HASHIMI在他的网站上指出了这一点: http://sedodream.com/2012/08/19/VisualStudioProjectCompatabilityAndVisualStudioVersion.aspx 对于我的情况,场景是我启用了Visual Studio兼容性,以便在VS2010或2012中打开MVC Web项目(如Sayed在上面的链接中所述) - 因此,我在本地使用VS2012进行开发,而TeamCity构建代理具有VS 2010 Web构建和部署目标。

1
在使用VS2012时遇到了这个问题 - 最终在构建服务器上安装了Web开发工具,问题得以解决。

4
你所说的"web developer tools"到底是指什么? - iwo
我认为这是在VS安装菜单中的Web开发工具。 - Jan Lobau

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