Azure devops dotnet构建与Azure DevOps上的发布

Azure devops dotnet构建与Azure DevOps上的发布,azure-devops,azure-pipelines-release-pipeline,Azure Devops,Azure Pipelines Release Pipeline,我有一个.NETCore2.0控制台应用程序。我可以成功构建或发布此应用程序并在本地运行。我还可以在Azure DevOps中成功构建和发布此应用程序。但是,如果我在Azure DevOps中构建应用程序,则无法运行结果 在Azure DevOps中,我尝试使用以下方式构建: dotnet构建-c发布-r win-x64-o应用程序 这只会生成少量与项目相关的文件。它并没有包括所有的System.*.dll文件,在我的大多数情况下,这些文件似乎都太多了。当我在本地计算机上运行该命令时,该命令工作

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

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

dotnet构建-c发布-r win-x64-o应用程序

这只会生成少量与项目相关的文件。它并没有包括所有的System.*.dll文件,在我的大多数情况下,这些文件似乎都太多了。当我在本地计算机上运行该命令时,该命令工作正常,我可以成功单击MyApp.exe文件并运行我的控制台应用程序。但是,如果我在Azure DevOps上运行相同的命令,则生成的MyApp.exe文件不会按预期运行。相反,它先开始,然后立即退出。控制台应用程序中未打印任何内容。我看不出有错误。该应用程序非常基础,包括一个“try-catch”,周围的一切,并有一个
控制台。ReadLine
。所以,我想它会一直开着

当我跑步时:

dotnet发布-c发布-r win-x64-o应用程序

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


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

它们之间的不同之处在于:

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

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

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


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

马嘴上的回答:

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

如果项目具有第三方依赖项,例如 NuGet,它们是从NuGet缓存解析的,不可用于 项目的已建输出。考虑到这一点,dotnet的产品 生成尚未准备好传输到另一台计算机以运行

-生成项目及其所有依赖项

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

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

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

要运行的命令:
dotnet构建
dotnet发布

dotnet clean
清理bin文件夹

此外,在根级别运行此操作,并在启用自包含标志的情况下观察输出:

dotnet发布-o./output--runtime win10-x64--self-contained


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