我有一个.NET Core 2.0控制台应用程序。我可以成功构建或发布此应用并在本地运行。我还可以在Azure DevOps中成功构建和发布此应用程序。但是,如果我在Azure DevOps中 build 应用程序,则无法运行结果。
在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 ...
在本地工作,但是当我在Azure DevOps中运行dotnet build ...
时,似乎没有得到相同的行为。看来我被迫使用dotnet publish
。我的问题是,生成的.zip文件从〜500kb变为30MB。这是很大的不同。
答案 0 :(得分:0)
从马口中得到的答案:
dotnet build命令将项目及其依赖项构建到 一组二进制文件。二进制文件中包含项目的代码 具有.dll扩展名和符号的中间语言(IL)文件 用于扩展名为.pdb的调试文件。依赖JSON 产生文件(* .deps.json),其中列出了 应用。生成一个* .runtimeconfig.json文件,该文件指定 共享的运行时及其应用程序的版本。
如果项目具有第三方依赖性,例如来自 NuGet,它们是从NuGet缓存中解析的,不适用于 项目的构建输出。考虑到这一点,dotnet的产品 版本尚未准备好转移到另一台机器上运行。
dotnet build
-构建项目及其所有依赖项。
dotnet publish
-将应用程序及其依赖项打包到一个文件夹中,以部署到托管系统。 (PS-这也会在打包之前构建应用程序)
考虑到它是直接来自微软的,因此该描述实际上非常好,因此在此我不再赘述。
作为练习,创建一个包含多个项目的解决方案。对于其中一个项目,请添加对另一个项目的引用。添加一些您的代码引用的静态文件和一些NuGet包。然后在解决方案根目录级别和项目级别运行这些命令,并观察bin文件夹中的输出。
要运行的命令:
dotnet build
dotnet publish
dotnet clean
清理bin文件夹
此外,在根级别运行此命令,并观察启用了自包含标志的输出:
dotnet publish -o ./output --runtime win10-x64 --self-contained