如何告诉TFS部署多个包含在一个解决方案中的webapp?

时间:2011-06-23 16:01:45

标签: visual-studio-2010 iis msbuild tfs2010 webdeploy

我们有一个解决方案,其中包含一个webapp项目和一些附带的项目。我们的TFS 2010每晚都在构建此解决方案,并将Web应用程序部署到IIS服务器。它像微风一样运行。

在TFS构建定义的Process选项卡中,您可以指定“MSBuild Arguments”。这是我们的构建定义中设置的值(全部在一行中):

/p:DeployOnBuild=True 
/p:DeployTarget=MsDeployPublish 
/p:CreatePackageOnPublish=True 
/p:MSDeployPublishMethod=WMSVC
/p:MSDeployServiceUrl=<service url of IIS> 
/p:DeployIisAppPath="<a website>" 
/p:UserName=<domain>\<user 
/p:Password=<password> 

此博客文章解释了整个设置: http://vishaljoshi.blogspot.com/2010/11/team-build-web-deployment-web-deploy-vs.html

到目前为止,非常好。

现在我们已经添加了第二个webapp项目,我们希望每晚都将它部署到同一个IIS中。不幸的是,在这种情况下,设置不适用。 TFS只部署一个webapp。

还有其他人有同样的问题:

TFS 2010 + MSDeploy when solution has multiple web applications

WebDeploy to deploy multiple web sites

Vishal R. Joshi建议为每个webapp项目添加一些属性。现在,发布版本将为每个webapp项目生成webpackage(zip文件),该项目具有以下定义的属性:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DeployOnBuild>True</DeployOnBuild>
    <DeployTarget>Package</DeployTarget>
    <CreatePackageOnPublish>true</CreatePackageOnPublish>
</PropertyGroup>

确定。但是如何让TFS将每个webapp部署到IIS呢?还有其他想法吗?

4 个答案:

答案 0 :(得分:13)

正如Vishal在您自己链接的博客文章中所描述的那样,所有MSBuild参数都可以在csproj中移动。这意味着每个项目都可以有自己的设置。

我有一个包含6个项目,4个类库和2个Web(WCF和MVC应用程序)的解决方案。我遵循Vishal博客的指令,简单地将所有MSBuild参数移动到每个csproj文件中..即

  <PropertyGroup>
    <DeployOnBuild>True</DeployOnBuild>
    <DeployTarget>MsDeployPublish</DeployTarget>
    <CreatePackageOnPublish>True</CreatePackageOnPublish>
    <MSDeployPublishMethod>InProc</MSDeployPublishMethod>
    <MSDeployServiceUrl>localhost</MSDeployServiceUrl>
    <DeployIisAppPath>Dev.Auzzy\Web</DeployIisAppPath>
    <UserName>Username</UserName>
    <Password>Password</Password> 
    ...

确保然后从构建定义中删除参数。

然后TFS按预期部署..将每个项目放入指定为每个IIS站点的主目录的正确文件夹中。

另外值得注意的是,您不能像上面那样在PropertyGroup中包含DeployIisAppPath,而是使用项目的属性页面为每个构建配置指定此项。 (右键单击每个项目&gt;属性&gt;打包/发布Web)。

答案 1 :(得分:5)

这个问题我花了2天时间。我找到了一个适合我的简单解决方案。

我使用名为DeployMvc1,DeployMvc2的解决方案配置管理器创建了另外2个配置。 取消选中DeployMvc1中的MVC2项目构建,并取消选中DeployMvc2中MVC1项目的构建

接下来,我创建了2个构建定义DeployMvc1Build和DeployMvc2Build。第一个用

监听MVC1项目
/p:DeployObBuild=true
/p:Deploytarget=MsDeployPublish
/p:Configuration=DeployMvc1
/p:Platform="Any CPU"
/p:MSDeployPublishMethod=WMSvc
/p:MsDeployServiceUrl="https://{server1}:8172/MsDeploy.axd"
/p:DeployIisAppPath="mvc1"
/p:AllowUntrustedCertificate=True
/p:Username="{username}"
/p:Password={password}

第二个用

监听MVC2项目
/p:DeployObBuild=true
/p:Deploytarget=MsDeployPublish
/p:Configuration=DeployMvc2
/p:Platform="Any CPU"
/p:MSDeployPublishMethod=WMSvc
/p:MsDeployServiceUrl="https://{server2}:8172/MsDeploy.axd"
/p:DeployIisAppPath="mvc2"
/p:AllowUntrustedCertificate=True
/p:Username="{username}"
/p:Password={password}

然后我的问题解决了。

答案 2 :(得分:1)

我有类似的情况,我有一个TFSBuild.proj构建文件,我在构建结束时生成一些安装程序和包,目标是每个部署环境:开发,测试,暂存和生产。 @Matt Shepherd的答案中定义的属性也可以直接提供给 MSBuild 任务,而不是将它们写入单个项目文件中。

<!-- After build -->
<Target Name="AfterCompileSolution">

  <!-- Create SynchWorkflow deployment packages -->
  <CallTarget Targets="PackageSynchWorkflow" />

</Target>

<!-- Build deployment package for each target environment -->
<ItemGroup>
  <BuildMode Include="Development"/>
  <BuildMode Include="Test"/>
  <BuildMode Include="Staging"/>
  <BuildMode Include="Production"/>
</ItemGroup>
<PropertyGroup>
  <PackageLocation>$(OutDir)</PackageLocation>
</PropertyGroup>

<Target Name="PackageSynchWorkflow" Outputs="%(BuildMode.Identity)">
  <Message Text="Building %(BuildMode.Identity)"/>

  <MSBuild Projects="$(SolutionRoot)\SynchWorkflow\SynchWorkflow.csproj"
           Properties="Platform=Any CPU;
                       Configuration=%(BuildMode.Identity);
                       DeployOnBuild=true;
                       DeployTarget=Package;
                       DeployIisAppPath=Default Web Site/SynchWorkflow;
                       OutputPath=$(PackageLocation)\SynchWorkflow.%(BuildMode.Identity)Package;"/>
</Target>

在这种情况下,可以指定 DeployIisAppPath ,该值将写入部署包参数文件。

答案 3 :(得分:0)

一种选择是在MSBuild任务中编写它。通过这种方式,您可以支持多个IE无限制的Web应用程序部署。我还没有移植我们现有的proj文件,这就是为什么我没有遇到这个问题。无论如何,这篇文章概述了这个过程:

Article

希望有所帮助