如何将 exe 发布与控制台 .net core 2.2 应用程序的 VS2019 构建集成?

Posted

技术标签:

【中文标题】如何将 exe 发布与控制台 .net core 2.2 应用程序的 VS2019 构建集成?【英文标题】:How do I integrate exe publishing with the VS2019 build of the console .net core 2.2 application? 【发布时间】:2020-05-29 12:30:21 【问题描述】:

我看到了几个类似的问题,但到目前为止,对于将发布步骤与构建过程集成的问题,我没有找到单一的答案。不幸的是,dotnet publish 命令会再次重建项目,这意味着如果我将“dotnet publish”命令放在项目的构建后步骤中,我会得到一个无限循环的构建重试。

我想要实现的是为我的 .NET Core 2.2 控制台应用程序构建一个 exe,用于一些选定的环境,例如。 osx 和 windows-10,也可能是 linux,每个都在自己的文件夹中。明显的条件是它必须与构建集成,因此不需要额外的手动步骤(命令)。这必须在 VS2019 Pro 以及 CI(如 AzureDevOps)中工作。

这个基本步骤是可以实现的,还是 .Net Core 是软件开发进程中的一大退步? 我希望我只是错过了一些东西,我只是在夸大其词。 :)

谢谢,拉德克

【问题讨论】:

由于您想多次发布,单独的 PowerShell 脚本是一种非常常见的方法,github.com/lextm/restructuredtext-antlr/blob/v1.0.1/… 您好朋友,我的解决方法可以帮助您解决在 Azure Devops CI 中执行此操作的问题吗? 【参考方案1】:

如何将 exe 发布与控制台的 VS2019 构建集成 .net core 2.2 应用?

其实,我想你不必担心这个。

dotnet publish 已经包含构建过程。 Publish 进程将首先执行Build,然后运行发布。总之,构建是发布过程的一部分。

所以当你在Build下输入dotnet publish时,你会得到一个无限循环的构建重试。

解决方案

----- 只需删除xxx.csproj 文件中的构建后事件,直接删除dotnet publish,它将首先运行构建过程。

您可以在本地VS中测试,当您右键单击您的项目时-->发布,它将在输出窗口中显示该步骤。

另外,据我所知,Azure DevOps 有一个名为 dotnet publish 的任务,其中包含 Build。

并且如果你只想为发布步骤做一些 msbuild 自定义目标,你可以添加一个类似Condition="'$(DeployOnBuild)'=='true'" 的条件,它将执行发布过程而不是正常的构建步骤(对-单击您的项目-->构建)。

<Target Name="testone" Condition="'$(DeployOnBuild)'=='true'" AfterTargets="Build">

    xxxxxxxxxxxxxx  

</Target>

---------------更新1----

第一个问题

其实,发布的构建是纯过程,然后发布将构建输出的内容复制到发布文件夹中。所以执行程序只是来自构建输出文件夹。

查看发布日志:

因此您不应该在构建过程中指定发布目标。这是多余的。

第二个问题

要为 Window-10、linux 或 osx 生成此程序,您可以尝试以下命令行来发布您的项目:(Release 是标准发布构建配置)

对于 Win-10:

dotnet publish -r win10-x64 -c Release --self-contained

Linux:

dotnet publish -r linux-x64 -c Release --self-contained

对于 osx:

dotnet publish -r osx.10.12-x64 -c Release --self-contained

这样,首先根据指定的运行时构建项目,然后发布。

更多.NET Core RID Catalog,可以参考this document。

更新 2

我认为您应该更改此包 UI 中的配置:

然后点击保存

另外,当你发布这个 web 项目时,请尝试删除 bin 和 obj 文件夹,然后再发布。

调试bin\Debug\netcoreapp2.1\publish

发布bin\Release\netcoreapp2.1\publish

或者您应该使用我描述的 dotnet 命令来发布项目。该路径位于 Debug 或 Release 文件夹下。

【讨论】:

这回答了我的部分问题。非常感谢。但是,我应该更具体。我正在寻找每次按 F5(构建)时生成可执行文件的解决方案。我试图在 VS2019 中找到一个快捷方式来将其分配给发布操作,但没有这样的操作可用。所以我想唯一可用的是通过构建后操作。 另一个问题是作为自包含的 .net-core 2.2(调试)发布操作生成的 Exe 不是自包含的,并且由于报告缺少 dll 而无法运行。 我想知道的另一个问题是您的输出文件夹(bin)是否有一些额外的 dll。请将它与发布文件夹进行比较,让我知道它缺少一些 dll。这只是我想确认的信息。我会尽快研究您的问题。 感谢@Perry Qian-MSFT。好的,我想我发现了一个问题。 VS2019 (Pro) 中的发布选项卡不会在解决方案配置更改时更新目标路径(从调试到发布,反之亦然)。这就是为什么我查看 bin\Debug\netcoreapp2.2\publish\ 但它实际上在 bin\Release\netcoreapp2.2\publish\ 中的原因。我不知道这是否是设计使然。可能不是。值得调查。谢谢。【参考方案2】:

我想要实现的是为我的 .NET Core 2.2 构建一个 exe 一些选定环境的控制台应用程序,例如。 osx 和 windows-10, 也可能是linux,每个都在自己的文件夹中。明显的条件是 它必须与构建集成,因此无需额外的手动步骤 (命令)是必需的。这必须在 VS2019 Pro 中作为 在 CI 中表现出色(如 AzureDevOps)。

这个基本步骤是可以实现的还是 .Net 核心是一个重大的退步? 软件开发进度?

这是个好主意,但据我所知,目前还没有 100% 支持您想要的。

您的预期情景似乎是:

点击Build(F5)按钮=>项目将在不同平台上构建win-x64,win-x86,linux-x64...,也会以自包含模式自动发布到不同平台。

但事实是:

1.单击构建按钮(Build(F5) 等于项目上下文中的构建按钮)将运行Build 目标(用于构建的每个项目的默认内置目标)。 => dotnet build in command-line.

2.单击发布按钮将运行Publish 目标(用于发布的每个项目的默认内置目标)。 => dotnet publish in command-line.

3.如果您在构建后事件中有任何build/publish 命令,它将导致预期的循环。所以很难将publishbuild 完美结合,因为它们是VS 中的两个动作,具有不同的按钮/行为/相应命令。 (只有 dotnet publish 命令可以识别--self-contained

4.并行构建/发布项目,批处理文件或msbuild targets文件是不错的选择。

#1.使用一个构建命令构建不同的平台,请参阅this。 #2.使用一个命令发布不同的平台,请参阅this。 (他们都使用自定义 .targets 来完成这项工作)

建议:

根据您的情况,我认为您可以考虑使用#2。在您的正常开发过程中,您不必使用不同的平台进行构建。

1.在本地VS开发调试时:

默认的构建按钮/选项足以让您调试。

2.在本地VS中,当你想在不同平台上发布项目时:

使用上面的#2,以便您可以使用 cmd.exe 或 PS.exe 发布它们。 (通过命令dotnet msbuild -restore -t:PublishAllRids

3.在 AzDeops 中自动化 CI 管道时(也使用 #2):

带有dotnet msbuild -restore -t:PublishAllRids 命令的 CMD/PS 任务就足够了。如果我们不传递 --no-build 参数,Dotnet 发布将自动构建。

4.Azure Devops Service 建议将不同任务中的作业分开,不建议将 Publish 与 Build 大量集成,尤其是对于 .net core 项目。 (这里是 official sample 关于 .net 核心项目的 CI。)

【讨论】:

以上是关于如何将 exe 发布与控制台 .net core 2.2 应用程序的 VS2019 构建集成?的主要内容,如果未能解决你的问题,请参考以下文章

如何运行.Net Core dll?

在.NET Core 3.0中发布单个Exe文件(PublishSingleFile)

在 .NET Core RC2 中构建 .exe 文件

.Net Core控制台生成exe能独立运行

将 .Net Core 构建为 EXE 而不是 DLL

使用 Visual Studio 2017 将 .NET Core 应用程序编译为 EXE 文件