dotnet构建与在Azure DevOps上发布

use*_*554 6 azure-devops azure-pipelines-release-pipeline

我有一个.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。这是很大的不同。

sta*_*SFT 8

它们之间的区别在于:

对于发布,必要的程序集文件(包)将包含在构建文件夹中,应用程序使用这些程序集。

但是对于构建,应用程序引用用户文件夹中的包。这就是 zip 文件只有 500 kb 的原因。

由于它引用了用户文件夹中的包,因此需要在同一用户的帐户下构建该应用程序,然后您可以在不发布的情况下运行该应用程序。因此,您需要将构建代理的服务帐户更改为您的帐户(登录身份),然后重新启动服务并将新构建加入队列。

否则,您需要发布应用程序。

  • @user687554 这个想法是发布的应用程序是**自包含的**——它具有*所有*运行所需的引用,并且依赖于*没有*预先存在于它运行的机器上。 (4认同)
  • @DanielMann - 这是有道理的。但是,在某些情况下,机器已经安装了 .NET Core 2.1。在这些情况下,`publish` 似乎过多,但 `build` 似乎不起作用。我在这里缺少什么?似乎我应该能够将 .NET Core 2.1 控制台应用程序部署到已经安装了 .NET Core 2.1 的机器上,而无需使用“publish”。还是我错了? (4认同)
  • 谢谢您的答复。但是,我并不完全理解这一点。假设我有两台独立的计算机,它们已经安装了 .NET Core 2.1。现在,假设我在计算机 A 上使用 `dotnet build` 构建我的代码。然后,我将 `bin\Release\netcoreapp2.1` 目录中生成的文件复制到计算机 B。我听说我不能在那里运行那些文件?在计算机 B 上运行该应用程序的唯一方法是首先运行“dotnet publish”并每次都包含所有文件? (3认同)

Sha*_*n C 5

从马口中回答:

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 清理垃圾箱文件夹

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

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

有关独立构建的更多信息