Asp.net web api TFS 2017构建定义:打包用于部署的Web API项目

Asp.net web api TFS 2017构建定义:打包用于部署的Web API项目,asp.net-web-api,tfs,msbuild,visual-studio-2017,Asp.net Web Api,Tfs,Msbuild,Visual Studio 2017,我有一个包含四个项目的Visual Studio解决方案: 1个桌面应用程序; 1.Windows服务; 2个Web API项目 这些项目已从VS2010->2013->2017迁移。我已经删除/编辑了尽可能多的遗留内容 该解决方案在2017年构建良好 我只希望构建一个webapi项目,生成一个部署包,并将该包作为工件发布。发布定义将使用WinRM在运行IIS的Windows Server 2012系统上部署包 在生成定义中,我有一个MSBuild任务 此任务的参数如下所示: 项目设置为TFS源

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

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

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

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

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

在生成定义中,我有一个MSBuild任务

此任务的参数如下所示:

  • 项目设置为TFS源代码管理中my webAPI.csproj的路径
  • 平台设置为“AnyCPU”-(“AnyCPU”不工作..这是一个已知(旧)问题)
  • 配置为“发布”
  • MSBuild参数为:
  • /p:DeployOnBuild=true/p:WebPublishMethod=Package /p:packageAssingFile=true/p:skipinValidConfiguration=true/p:PackageLocation=$(Build.ArtifactStagingDirectory)\webapi.zip

  • Clean设置为true
  • 构建成功完成,但是生成的webapi.zip包包含大量文件夹结构:

    C:\agent2\u work\27\a\webapi.zip\Content\C\agent2\u work\27\s\MyProduct.webapi\obj\release\Package\PackageTmp

    问题:

  • 为什么要打包这条完整的路径?(c:\agent2\u work是我的构建代理的目录)
  • 我如何改变它

  • 这是预期的行为,它基于您的包位置。如果在VS中发布项目,您将发现类似的文件夹结构。有关详细信息,请参阅。供您参考

    但是,您可以使用MSBuild参数中使用的发布配置文件更改文件夹结构。要做到这一点,请执行以下步骤:

    1,创建发布配置文件。

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

    2,编辑配置文件的
    .pubxml
    文件,并在之前添加以下内容 关闭
    标记
    。(创建目标
    AddReplaceRuleForAppPath
    ,并通过将其添加到
    PackageDependsOn
    属性将其注入包进程。执行此目标后,将向MSDeployReplaceRules项目组添加替换规则。)

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


    为了让事情变得简单一点,我刚刚创建了一个nuget包,可以自动为您执行这些步骤。看


    只要从Visual Studio将其安装到web应用程序项目中,只需一个单词“web”,即可更改“内容”下面的长路径。

    Andy,再次感谢您的帮助。非常感谢。我正准备用WinRM将软件包部署到IIS,我绝对需要确保我使用的是正确、现代的方式。我正在努力解决这个问题。使用这些参数运行msbuild:/p:DeployOnBuild=true/p:WebPublishMethod=Package/p:PackageAsSingleFile=true/p:PublishProfile=CIProfile/p:SkipinValidConfiguration=true/p:PackageLocation=“c:\temp\publish”/p:platform=“任意cpu”/p:configuration=“Release”-看起来没有什么不同。我最终还是得到了一个具有巨大目录结构的zip文件。
    <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>
    
    /p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:PublishProfile=1011DP /p:SkipInvalidConfigurations=true /p:PackageLocation=$(Build.ArtifactStagingDirectory)