16

我们有一个单一的解决方案,其中包含一个 webapp 项目和一些附带的项目。我们的 TFS 2010 每天晚上都在构建这个解决方案,并将 webapp 部署到 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。

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

当解决方案具有多个 Web 应用程序时 TFS 2010 + MSDeploy

WebDeploy 部署多个网站

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

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

好的。但是如何带上 TFS 将每个 webapp 部署到 IIS 上呢?还有其他想法吗?

4

4 回答 4

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,而是使用项目的属性页面为每个构建配置指定此项。(右键单击每个项目 > 属性 > 打包/发布 Web)。

于 2011-08-01T23:07:47.940 回答
5

It took me 2 days on this problem. I found a freaking simple solution that works for me.

I created 2 more configurations by using solution's Configuration Manager named DeployMvc1, DeployMvc2. Uncheck build for MVC2 project in DeployMvc1 and uncheck build for MVC1 project in DeployMvc2.

Next, I created 2 build definitions DeployMvc1Build and DeployMvc2Build. The first one listens to MVC1 project with

/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}

The second one listens to MVC2 project with

/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}

Then my problem solved.

于 2013-03-22T17:23:41.793 回答
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并将该值写入部署包参数文件。

于 2012-02-13T22:00:39.893 回答
0

一种选择是在 MSBuild 任务中编写它。通过这种方式,您可以支持多个 IE 无限制 webapp 部署。我还没有移植我们现有的执行此操作的 proj 文件,这就是我没有遇到这个问题的原因。无论如何,这是一篇概述该过程的文章:

文章

希望有帮助

于 2011-06-24T19:26:44.607 回答