“dotnet publish”命令行跳过部署到 Azure Functions

Posted

技术标签:

【中文标题】“dotnet publish”命令行跳过部署到 Azure Functions【英文标题】:The 'dotnet publish' command line skips deployment to Azure Functions 【发布时间】:2018-10-29 14:48:22 【问题描述】:

我正在为我的站点设置一些 DevOps,到目前为止,我已成功使用以下命令在两个 ASP.NET Core 应用上进行部署:

dotnet publish ProjectName.csproj /p:PublishProfile="PublishProfileName" /p:Password=password

我刚刚使用 V2 运行时和 .NET Core 2.1 创建了一个 Azure 函数,正如对所有新项目的建议(请参阅此处 https://azure.microsoft.com/en-us/blog/introducing-azure-functions-2-0/),但如果我使用相同的命令,我发现它只会发布它到本地文件夹,似乎没有将项目部署到 Azure。

如果我使用 MSBuild 等价物,它似乎也错过了部署阶段。

我猜测它在某种程度上与项目类型有关,没有适当的构建目标,但我不确定如何进一步跟踪。

我可以从 Azure 下载发布设置,将它们导入 Visual Studio 并通过 VS 发布,所以看起来如果 VS 路径有效,这可能是某处工具中的回归或错误,而不是不受支持的东西?

我正在使用:

Visual Studio 15.8.8 +28010.2048 Azure Functions 和 Web 作业工具 15.9.02046.0

如果我不应该将 dotnet publish 与 Azure 函数一起使用,我应该使用什么来代替命令行 CD?我已经看到对 Azure Function CLI 工具的引用,但如果可以通过其他工具完成,我宁愿不必在我们的构建代理上安装包管理器。

【问题讨论】:

如果从 VS 发布工作,那么只需使用 MSBuild 进行部署。这就是我发布函数的方式。 msbuild /p:DeployOnBuild=True /p:PublishProfile=somename.pubxml /p:Configuration=Release @Svend,感谢命令行。看,这是奇怪的事情,我尝试了你的命令行,但它似乎仍然跳过了实际部署到天蓝色。 MSBuild 的最后一条日志是它到达 Publish 将其输出到本地文件夹,然后 _GenerateFunctionsAndCopyContentFiles 似乎移动了更多文件夹,然后完成。当然这意味着我的 Visual Studio 版本中存在错误/回归?我会重新安装,但我真的没有那么多空闲时间! :) @Svend,更奇怪的是,我正在创建一个 repro 来记录针对 MSBuild 或 VS 的问题,似乎如果我在新解决方案中创建一个干净的函数项目,命令行就可以工作。如果我在现有解决方案的新项目中使用相同的命令行,则会跳过部署!我猜想到达某个地方。 您很可能在 csproj 文件中存在问题。尝试比较项目文件,看看其中一个是否缺少某些内容。如果您正在处理“合法”的 msbuild/vs 错误,我会吃掉我的帽子。 顺便说一句,csproj 文件相同(或足够相似)。同样的 NuGet 包和版本控制。 【参考方案1】:

最后,在答案和 cmets 的帮助下(谢谢大家),我有一个正在部署我的 .NET Core 2.1 Function 项目的 MSBuild 命令行:

msbuild /p:DeployOnBuild=True /p:PublishProfile=somename.pubxml /p:Configuration=Release

然而,值得注意的是:

一般 .NET Core 发布说明

    如果您拼错发布配置文件名称,它将静默跳过部署(无警告或错误)。

ASP.NET Core 和 .NET Core Functions 部署的区别

    如果您使用“dotnet publish”,它将始终跳过部署。

    如果您不指定 /p:DeployOnBuild=True,它将跳过部署。

【讨论】:

通常如果您想使用 DeployOnBuild 属性,您可能只想为 specific project, instead of ALL eligible projects 调用它。是的,MSBuild 不是“用户友好的”。这是 VS.IDE 在 UI 下使用的东西,所以它非常有能力(并且值得学习 IMO)【参考方案2】:

如果您不想在构建代理上使用“包管理器”,则必须选择对函数应用进行 zip 部署。详细信息可以在此处的 MSDN 上找到:

https://docs.microsoft.com/en-us/azure/azure-functions/deployment-zip-push#rest

【讨论】:

感谢链接,我想我是顺便看到的,但我会再看一下。奇怪的是,它提到“Azure Functions 具有 Azure 应用服务提供的全方位持续部署和集成选项。”。在我的情况下似乎不是,因为相同的部署命令行不起作用。 :)【参考方案3】:

改用 Azure CLI: https://docs.microsoft.com/en-us/cli/azure/functionapp/deployment?view=azure-cli-latest

或功能核心工具: https://docs.microsoft.com/en-us/azure/azure-functions/functions-run-local#publish

【讨论】:

以上是关于“dotnet publish”命令行跳过部署到 Azure Functions的主要内容,如果未能解决你的问题,请参考以下文章

将 CSV 文件中的行跳过到某个单词 C#

使用文件复制文件夹和子文件夹,但使用Windows命令行跳过根文件夹中的文件

如何覆盖 dotnet publish 的目标文件夹

dotnet publish 在预发布完成之前运行

在 asp.net 核心的构建后事件中运行 dotnet publish

dotnet publish 不使用 appsettings.json