azure-devops - 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。这是很大的区别。
解决方案
马口中的回答:
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
推荐阅读
- android - 如何根据存储在回收站列表中的一些 int 值对 RecyclerView 进行排序
- sanity - "sanity init" command fails at "Resolving dependencies"
- angular - 如何在 Angular 中为开发和生产版本应用程序设置 i18n 资源的不同路径
- javascript - 从 SortableJS 调用函数作为全局变量
- java - Java:如何根据对象列表向数据框添加列
- javascript - Discord.js 通过 ID 或名称提及用户
- sql-server - SQL Server:使用子查询选择数据时,子查询返回超过 1 个值
- gradle - GitLab 插件 SonarQube MR 分析
- ruby - 有人喜欢挑战吗?minimax 井字游戏
- json - Symfony4 使用 crud 生成 API 休息