通过命令行构建.NET Core应用程序,以便它可以在未安装.NET Core的计算机上运行

我的最终目标是创建一个跨平台(非Web)控制台应用程序,所以我现在正在探索.NET Core。

在我之前的.NET项目中,我在Visual Studio中进行了所有开发,但我还创建了一个批处理/ MSBuild文件,因此我只需单击一下即可构建整个项目(包括设置,NuGet包,带二进制文件的zip文件等) 。 这是以前项目的一个例子 。

最后,我想用我的.NET Core测试项目做类似的事情。
但是现在我在第一步失败了:我无法在Visual Studio之外构建它,因此结果可以在没有安装.NET Core的另一台Windows机器上运行。
(在第一步中,我忽略了跨平台部分 – 我很乐意让它在Windows上运行)


是)我有的

我设法让它在Visual Studio 2015 Community Edition中工作,如下所示:

  1. 在Visual Studio中创建新项目: “新建项目”⇒“Web”⇒“控制台应用程序(包)”

  2. 在Visual Studio中创建新的发布配置文件(菜单中的“Build”⇒“Publish”)。
    这将创建一个PowerShell脚本 (以及一个带有设置的XML文件 )

这是我在GitHub上的测试项目 。

当我再次在菜单中“构建”⇒“发布”时,Visual Studio显然会再次执行先前创建的PowerShell脚本。
结果略超过90 MB,由598个文件夹中的825个文件组成,如下所示:

Visual Studio发布结果

当我将它复制到另一台机器上时(安装了Win 7 / .NET 4 / 安装.NET Core),它可以工作。


我试图在Visual Studio之外获得相同的结果

1. dotnet发布

这个答案和这个答案听起来像我可以使用dnu publish通过命令行实现相同的结果。
我知道.NET Core的部分目前仍在移动目标,所以显然dnu现在是dotnet

所以我尝试为它执行dotnet publish (并创建一个批处理文件 ):

 dotnet publish "%~dp0\src\CoreTestVisualStudio" -c Release -r win7-x64 -o "%~dp0\release\cli" 

结果包含一个.exe文件和一堆DLL,只有25个文件和1.5 MB,都在一个文件夹中:

dotnet发布结果

显然,这里缺少.NET Core运行时,正如预期的那样,当我尝试在没有安装.NET Core的机器上执行它时,此应用程序崩溃(与上面提到的相同)。

2.发布配置文件中的PowerShell脚本

我尝试在Visual Studio外部执行PowerShell脚本 (在我创建发布配置文件时创建),但它失败了,因为脚本需要一些参数而我不知道要传递什么:

 param($publishProperties, $packOutput, $nugetUrl) 

脚本中还有这一行:

 # to learn more about this file visit http://go.microsoft.com/fwlink/?LinkId=524327 

…但链接只指向.NET Web开发和工具博客的登录页面 。


TL; DR

我究竟做错了什么?

我知道.NET Core的第一个版本主要关注ASP.NET,但据我所知,ASP.NET Core应用程序也只是控制台应用程序,所以我认为一个基本的控制台应用程序现在可以工作。
另一方面,大多数控制台应用程序“入门”文档仍然缺失,所以也许它太早了,控制台应用程序的dotnet publish还没有完成?

几天之后编辑:我怀疑我没有做错,而且这是.NET Core命令行工具中的一个问题,所以我将它发布到命令行工具的问题跟踪器 。

问题解决了!
我将它发布在.NET Core命令行工具的问题跟踪器上 ,结果certificate它是dotnet publish一个错误 – 它没有捆绑C ++运行时,这是在没有机器上执行编译应用程序所必需的已安装.NET Core。

  • 临时解决方案是安装C ++运行时。

  • “真正的”解决方案是在三天前的拉取请求中完成的 ,现在包含在最新的安装程序中 。
    使用此版本, dotnet publish 捆绑C ++运行时,因此结果将在没有.NET Core的计算机上运行。

对于dnu

dnu publish有一个名为--runtime的选项,它指定dnu publish时要包含的运行时。 您可以在命令中使用完整的运行时名称,例如:

 dnu publish --runtime dnx-clr-win-x86.1.0.0-rc1 

对于dotnet

您不需要指定运行时或框架版本 – 默认情况下, dotnet publish将使用project.json的框架和当前运行时风格。 但是, 文件说明:

dotnet-publish命令还需要project.json中的某些依赖项才能工作。 即,必须将Microsoft.NETCore.Runtime包作为依赖项引用,以便命令将运行时文件以及应用程序的文件复制到已发布的位置