首页 > 解决方案 > dotnet 在 Azure DevOps 上构建与发布

问题描述

我有一个 .NET Core 2.0 控制台应用程序。我可以成功构建或发布这个应用程序并在本地运行它。我还可以在 Azure DevOps 中成功构建和发布这个应用程序。但是,如果我在 Azure DevOps 中构建应用程序,我将无法运行结果。

在 Azure DevOps 中,我尝试使用以下方法构建:

dotnet build -c Release -r win-x64 -o app

这会生成少量文件,其中仅包含项目相关文件。它不包括在我的大多数情况下似乎过多的所有 System.*.dll 文件等。当我在本地计算机上运行此命令时,它运行良好,并且我可以成功单击 MyApp.exe 文件并运行我的控制台应用程序。但是,如果我在 Azure DevOps 上运行相同的命令,生成的 MyApp.exe 文件不会按预期运行。相反,它开始然后立即退出。控制台应用程序中没有打印任何内容。我没有看到任何错误。该应用程序非常基本,包括围绕所有内容的“try-catch”,Console.ReadLine最后有一个。所以,我认为它会保持开放。

当我运行时:

dotnet publish -c Release -r win-x64 -o app

我得到相同的文件,但包含所有 System.*.dll 文件等。这一次,我注意到我可以成功运行 MyApp.exe 并且它的行为符合预期。

为什么在dotnet build ...本地工作,但我dotnet build ...在 Azure DevOps 中运行时似乎没有得到相同的行为。看来我被迫使用dotnet publish. 我的问题是,生成的 .zip 文件从 ~500kb 变为 30MB。这是很大的区别。

标签: azure-devopsazure-pipelines-release-pipeline

解决方案


马口中的回答:

dotnet build 命令将项目及其依赖项构建到一组二进制文件中。二进制文件包括带有 .dll 扩展名的中间语言 (IL) 文件中的项目代码和用于调试的带有 .pdb 扩展名的符号文件。生成的依赖项 JSON 文件 (*.deps.json) 列出了应用程序的依赖项。生成一个 *.runtimeconfig.json 文件,该文件指定应用程序的共享运行时及其版本。

如果项目具有第三方依赖项,例如来自 NuGet 的库,它们将从 NuGet 缓存中解析,并且不适用于项目的生成输出。考虑到这一点,dotnet build 的产品还没有准备好转移到另一台机器上运行。

dotnet build- 构建一个项目及其所有依赖项。

dotnet publish- 将应用程序及其依赖项打包到一个文件夹中,以便部署到托管系统。(PS - 这也在打包之前构建应用程序)

考虑到它直接来自微软,这个描述实际上非常好,所以我不会在这里重复这些词。

作为练习,创建一个包含多个项目的解决方案。对于其中一个项目,添加对另一个项目的引用。添加一些您的代码引用的静态文件和一些 NuGet 包。并在解决方案根级别和项目级别运行这些命令,并观察 bin 文件夹中的输出。

要运行的命令: dotnet build dotnet publish

dotnet clean清理 bin 文件夹

此外,在根级别运行它并观察启用了自包含标志的输出:

dotnet publish -o ./output --runtime win10-x64 --self-contained

有关独立构建的更多信息


推荐阅读