从TFS Build使用msdeploy时,“已经定义了”IIS Web应用程序名称“

时间:2014-03-13 18:50:53

标签: msbuild tfsbuild msdeploy

所以这就是交易:我有一个由众多项目组成的Visual Studio解决方案。其中两个项目是Web应用程序项目。在这两个中,我希望在成功构建/测试运行之后,让TFS构建将其中一个部署到我们的开发服务器。

要使Web应用程序部署,我更新了.csproj的部署目标,使其如下所示:

  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <DeployOnBuild>true</DeployOnBuild>
    <DeployTarget>MsDeployPublish</DeployTarget>
    <CreatePackageOnPublish>true</CreatePackageOnPublish>
    <MSDeployPublishMethod>WMSVC</MSDeployPublishMethod>
    <MSDeployServiceUrl>https://192.168.21.79</MSDeployServiceUrl>
    <DeployIisAppPath>DeploymentTest</DeployIisAppPath>
    <UserName>deploy</UserName>
    <Password>sosecure</Password>
    <AllowUntrustedCertificate>true</AllowUntrustedCertificate>
    <SkipExtraFilesOnServer>true</SkipExtraFilesOnServer>
  </PropertyGroup>

通过此配置,我的Web应用程序已成功部署到服务器。不幸的是,有一个小问题。由于进入这里过于令人沮丧的原因(并且在一天结束时,可能无法更改),当部署运行并将应用程序推送到我们的服务器时,会有一个CSS文件我需要跳过的项目。也就是说,我希望文件的服务器副本保持不变,即使它与项目中的内容不同。

为了支持这一要求,我将以下内容添加到我的.csproj中:

  <PropertyGroup>
    <OnBeforePackageUsingManifest>AddSkipRules</OnBeforePackageUsingManifest>
  </PropertyGroup>
  <Target Name="AddSkipRules">
    <ItemGroup>
      <MsDeploySkipRules Include="SkipCss">
        <SkipAction>Delete</SkipAction>
        <ObjectName>filePath</ObjectName>
        <AbsolutePath>site\.css$</AbsolutePath>
        <XPath>
        </XPath>
      </MsDeploySkipRules>
      <MsDeploySkipRules Include="SkipCss2">
        <SkipAction>Update</SkipAction>
        <ObjectName>filePath</ObjectName>
        <AbsolutePath>site\.css$</AbsolutePath>
        <XPath>
        </XPath>
      </MsDeploySkipRules>
    </ItemGroup>
  </Target>

添加了这个,我的期望是构建会跳过我的site.css文件的处理。唉,在尝试了许多不同的东西后,文件总是在服务器上更新。经过一番挖掘后,我发现了一些内容(此处为SO或博客,此时不记得),提到.csproj需要一个指令来确保msdeploy.exe用于处理部署。考虑到这一点,我添加了以下内容:

<PropertyGroup>
  <UseMsDeployExe>true</UseMsDeployExe>
</PropertyGroup>

现在,当我运行构建时,它失败并出现以下错误:

MSDEPLOY: The parameter 'IIS Web Application Name' has already been defined.

所以,我尝试从.csproj中删除<DeployIssAppPath>元素,但这只会导致以下错误:

C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\Web\Microsoft.Web.Publishing.targets (4220): The "ConcatFullServiceUrlWithSiteName" task was not given a value for the required parameter "SiteAppName".

此时我几乎没有想法,真的需要让这个东西运转起来。有关我错过的关于“IIS Web应用程序名称”错误的任何建议或见解。已定义或关于&#39; SiteAppName&#39;的最后一个错误没有价值将不胜感激。

1 个答案:

答案 0 :(得分:0)

您是否尝试在部署之前停止目标的应用池?我在PowerShell中使用类似的东西,在我的部署过程中从MSBuild调用:

echo ""
echo "Stopping $($args[0]) App Pool..."
echo ""
#Stop App Pool
MsDeployAppPoolSwitch $args[0] $args[1] $args[2] $args[3] "StopAppPool"

echo ""
echo "Deploying to $($args[0])..."
echo ""
#Deploy Site
WebsiteDeploy $args[0] $args[1] $args[2] $args[3] $DropFolder

echo ""
echo "Starting $($args[0]) App Pool..."
echo ""
#Start App Pool
MsDeployAppPoolSwitch $args[0] $args[1] $args[2] $args[3] "StartAppPool"