如何在Visual Studio 2017 中使用Resource Group 项目自动部署Function App 内容?
How to automatically deploy Function App contents using Resource Group project in Visual Studio 2017?
有关于如何自动部署 Web 应用程序的非常好的说明 - 创建所需的基础结构和部署 Web 应用程序内容。
例如,这描述得很好 here
但是,我找不到任何关于如何为函数应用程序完成此操作的详细说明。
我的情况是什么:
- 我将 Azure RM 模板部署与 Visual Studio 2017 资源组项目
一起使用
- 我已经成功定义函数模板
- 我已成功为函数定义 Web 部署模板
- 我已经将我的函数创建为一个单独的项目并且它工作正常
- 在Resource Group项目中,添加了对Function项目的引用,其属性定义如下:
当我部署资源组时失败并显示消息 "The target "Package" does not exist in the project."
这意味着它无法构建 ZIP 包。
如果我从 "Include Targets" 中删除 "Package" 参数,然后手动将 "package.zip" 提供给资源组项目,一切正常。
Resource Group项目应该如何配置才能自建Function App项目的ZIP包?
是否可以在函数应用项目中添加一个"Package"目标?
非常感谢!
如果您预先采用 Azure Devops 并使用 CI/CD 管道自动执行此过程,您将处于一个更好的位置。
我过去通过将部署分为三个步骤来完成许多这样的工作(我的项目往往有一个调用该函数的逻辑应用程序):
- 有一个ARM模板,其中包含除逻辑应用之外的所有资源组内容。首先使用 resource group deployment task
部署它
- 使用 app service deployment task 发布构建过程中生成的 zip 文件。这将创建在部署逻辑应用程序之前需要存在的函数应用程序端点
- 使用另一个资源组部署步骤从单独的 ARM 模板部署逻辑应用
我知道逻辑应用程序部分超出了您在问题中定义的范围,因此在您的情况下,您只需省略第三步。
即使只有一个简单的功能应用程序部署,我仍然认为拥有 CI/CD 管道将使您的生活在漫长的 运行 中变得更轻松。
我设法找到了一种解决方法,它实际上非常优雅且非常简单。
希望这对其他人有帮助:
1.在Function App项目
上安装"MSBuildTasks" NuGet package
2. 打开编辑Function App工程的.csproj文件,在<Project>
元素中添加如下内容:
<Project>
...
<Import Project="$(ProjectDir)obj\FunctionApp.csproj.nuget.g.targets" />
<ItemGroup>
<ProjectFiles Include="$(OutDir)\**\*.*" />
</ItemGroup>
<Target Name="Package">
<Zip Files="@(ProjectFiles)" WorkingDirectory="$(OutDir)" ZipFileName="$(PackageLocation)" />
</Target>
</Project>
- 上面代码段中的重要部分如下。他们帮助将目标绑定到资源组项目(参见问题中的图片):
Target
的名字应该是"Package",被Resource Group Project 调用
- 资源组项目
传递的$(PackageLocation)
属性的用法
基于 Vladislav 的非常有帮助的完整答案...
MSBuildTasks nuget 部署中的错误阻止了它的安装,如 .Net Core 项目的项目站点上所记录的那样。 .build 文件夹永远不会被创建。
如果您将 MSBuildTasks,版本 1.4.0.128 添加到解决方案中的 .Net Framework 项目,您可以使用网站上所述的导入:
<PropertyGroup>
<MSBuildCommunityTasksPath>$(SolutionDir)\.build</MSBuildCommunityTasksPath>
</PropertyGroup>
<Import Project="$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.Targets" />
有关于如何自动部署 Web 应用程序的非常好的说明 - 创建所需的基础结构和部署 Web 应用程序内容。 例如,这描述得很好 here
但是,我找不到任何关于如何为函数应用程序完成此操作的详细说明。
我的情况是什么:
- 我将 Azure RM 模板部署与 Visual Studio 2017 资源组项目 一起使用
- 我已经成功定义函数模板
- 我已成功为函数定义 Web 部署模板
- 我已经将我的函数创建为一个单独的项目并且它工作正常
- 在Resource Group项目中,添加了对Function项目的引用,其属性定义如下:
当我部署资源组时失败并显示消息 "The target "Package" does not exist in the project."
这意味着它无法构建 ZIP 包。
如果我从 "Include Targets" 中删除 "Package" 参数,然后手动将 "package.zip" 提供给资源组项目,一切正常。
Resource Group项目应该如何配置才能自建Function App项目的ZIP包?
是否可以在函数应用项目中添加一个"Package"目标?
非常感谢!
如果您预先采用 Azure Devops 并使用 CI/CD 管道自动执行此过程,您将处于一个更好的位置。
我过去通过将部署分为三个步骤来完成许多这样的工作(我的项目往往有一个调用该函数的逻辑应用程序):
- 有一个ARM模板,其中包含除逻辑应用之外的所有资源组内容。首先使用 resource group deployment task 部署它
- 使用 app service deployment task 发布构建过程中生成的 zip 文件。这将创建在部署逻辑应用程序之前需要存在的函数应用程序端点
- 使用另一个资源组部署步骤从单独的 ARM 模板部署逻辑应用
我知道逻辑应用程序部分超出了您在问题中定义的范围,因此在您的情况下,您只需省略第三步。
即使只有一个简单的功能应用程序部署,我仍然认为拥有 CI/CD 管道将使您的生活在漫长的 运行 中变得更轻松。
我设法找到了一种解决方法,它实际上非常优雅且非常简单。
希望这对其他人有帮助:
1.在Function App项目
上安装"MSBuildTasks" NuGet package
2. 打开编辑Function App工程的.csproj文件,在<Project>
元素中添加如下内容:
<Project>
...
<Import Project="$(ProjectDir)obj\FunctionApp.csproj.nuget.g.targets" />
<ItemGroup>
<ProjectFiles Include="$(OutDir)\**\*.*" />
</ItemGroup>
<Target Name="Package">
<Zip Files="@(ProjectFiles)" WorkingDirectory="$(OutDir)" ZipFileName="$(PackageLocation)" />
</Target>
</Project>
- 上面代码段中的重要部分如下。他们帮助将目标绑定到资源组项目(参见问题中的图片):
Target
的名字应该是"Package",被Resource Group Project 调用
- 资源组项目 传递的
$(PackageLocation)
属性的用法
基于 Vladislav 的非常有帮助的完整答案...
MSBuildTasks nuget 部署中的错误阻止了它的安装,如 .Net Core 项目的项目站点上所记录的那样。 .build 文件夹永远不会被创建。
如果您将 MSBuildTasks,版本 1.4.0.128 添加到解决方案中的 .Net Framework 项目,您可以使用网站上所述的导入:
<PropertyGroup>
<MSBuildCommunityTasksPath>$(SolutionDir)\.build</MSBuildCommunityTasksPath>
</PropertyGroup>
<Import Project="$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.Targets" />