【问题标题】:TFS 2017 Build Definition: Packaging Web API Project for deploymentTFS 2017 构建定义:打包 Web API 项目以进行部署
【发布时间】:2018-03-21 18:55:29
【问题描述】:

我有一个包含四个项目的 Visual Studio 解决方案:

1 个桌面应用程序; 1个Windows服务; 2 个 Web API 项目。

这些项目是从 VS2010 -> 2013 -> 2017 迁移而来的。我已经删除/编辑了尽可能多的遗留内容。

该解决方案在 2017 年构建良好。

我希望只构建一个 Web API 项目,生成一个部署包,并将该包发布为一个工件。发布定义将使用 WinRM 在运行 IIS 的 Windows Server 2012 系统上部署包。

在我的构建定义中,我有一个 MSBuild 任务。

该任务的参数如下:

  1. 项目在 TFS 源代码控制中设置为我的 webAPI .csproj 的路径
  2. 平台设置为“AnyCPU”-(“Any CPU”不起作用..这是一个已知(旧)问题)
  3. 配置为“发布”
  4. MSBuild 参数是:

/p:DeployOnBuild=true /p:WebPublishMethod=包 /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation=$(Build.ArtifactStagingDirectory)\webapi.zip

  1. Clean 设置为 true

构建成功完成,但是生成的 webapi.zip 包包含大量文件夹结构:

C:\agent2_work\27\a\webapi.zip\Content\C_C\agent2_work\27\s\MyProduct.WebApi\obj\release\Package\PackageTmp

问题:

  1. 为什么要打包这个完整的路径? (c:\agent2_work 是我的构建代理的目录)
  2. 如何更改?

【问题讨论】:

    标签: asp.net-web-api tfs msbuild visual-studio-2017


    【解决方案1】:

    这是预期的行为,它基于您的包裹位置。如果你在 VS 中发布项目,你会发现类似的文件夹结构。有关详细信息,请参阅Create a Web Deployment Package in Visual Studio。和this thread 供您参考。

    但是,您可以使用 MSBuild 参数中使用的 发布配置文件 更改文件夹结构。按照以下步骤进行操作:

    1、创建发布配置文件。

    在 VS 中创建 Web 部署包 将首先为此创建一个发布配置文件。当你这样做时,一个 .pubxml 文件将在下面为您创建 属性\发布配置文件。这是您的发布配置文件,它是一个 MSBuild 文件。您可以通过编辑自定义发布过程 这个文件。我们将修改此文件以更新这些路径 在包装中。

    2、编辑配置文件的.pubxml文件并在前面添加以下内容 结束 </Project> 标记。 (创建目标AddReplaceRuleForAppPath,并通过将其添加到PackageDependsOn 属性将其注入到打包过程中。一旦执行此目标,它将向MSDeployReplaceRules 项组中添加一个替换规则。)

    <PropertyGroup>
      <PackagePath Condition=" '$(PackagePath)'=='' ">WebApi</PackagePath>
      <EnableAddReplaceToUpdatePacakgePath Condition=" '$(EnableAddReplaceToUpdatePacakgePath)'=='' ">true</EnableAddReplaceToUpdatePacakgePath>
      <PackageDependsOn>
        $(PackageDependsOn);
        AddReplaceRuleForAppPath;
        </PackageDependsOn>
    </PropertyGroup>
    
    <Target Name="AddReplaceRuleForAppPath" Condition=" '$(EnableAddReplaceToUpdatePacakgePath)'=='true' ">
      <PropertyGroup>
        <_PkgPathFull>$([System.IO.Path]::GetFullPath($(WPPAllFilesInSingleFolder)))</_PkgPathFull>
      </PropertyGroup>
    
      <!-- escape the text into a regex -->
      <EscapeTextForRegularExpressions Text="$(_PkgPathFull)">
        <Output TaskParameter="Result" PropertyName="_PkgPathRegex" />
      </EscapeTextForRegularExpressions>
    
      <!-- add the replace rule to update the path -->
      <ItemGroup>
        <MsDeployReplaceRules Include="replaceFullPath">
          <Match>$(_PkgPathRegex)</Match>
          <Replace>$(PackagePath)</Replace>
        </MsDeployReplaceRules>
      </ItemGroup>
    </Target>
    

    3、保存发布配置文件并签入更改

    4、在 MSBuild 参数下方输入:(在本例中,我的发布配置文件名称为 1011DP.pubxml

    /p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:PublishProfile=1011DP /p:SkipInvalidConfigurations=true /p:PackageLocation=$(Build.ArtifactStagingDirectory)  
    

    5、运行构建,然后检查文件夹结构。

    【讨论】:

    • 安迪,再次感谢您的帮助。非常感激。我正处于使用 WinRM 将包部署到 IIS 的风口浪尖上,并且绝对需要确保我使用的是正确、现代的做事方式。
    • 我正在努力解决这个问题。使用这些参数运行 msbuild: /p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:PublishProfile=CIProfile /p:SkipInvalidConfigurations=true /p:PackageLocation="c:\temp\publish" / p:platform="any cpu" /p:configuration="Release" - 只是似乎没有做任何不同的事情。我仍然得到一个具有巨大目录结构的 zip 文件。
    【解决方案2】:

    为了让事情变得更简单,我刚刚创建了一个 nuget 包,它会自动为您执行这些步骤。见https://www.nuget.org/packages/SharpSvn.ShortMSDeployWebContentPath

    只需从 Visual Studio 将其安装到您的 Web 应用程序项目中,将更改“内容”下方的长路径,仅包含一个单词“网络”

    【讨论】:

      猜你喜欢
      • 2012-10-10
      • 1970-01-01
      • 2011-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-06
      相关资源
      最近更新 更多