通过命令行构建.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中工作,如下所示:
-
在Visual Studio中创建新项目: “新建项目”⇒“Web”⇒“控制台应用程序(包)”
-
在Visual Studio中创建新的发布配置文件(菜单中的“Build”⇒“Publish”)。
这将创建一个PowerShell脚本 (以及一个带有设置的XML文件 )
这是我在GitHub上的测试项目 。
当我再次在菜单中“构建”⇒“发布”时,Visual Studio显然会再次执行先前创建的PowerShell脚本。
结果略超过90 MB,由598个文件夹中的825个文件组成,如下所示:
当我将它复制到另一台机器上时(安装了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,都在一个文件夹中:
显然,这里缺少.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包作为依赖项引用,以便命令将运行时文件以及应用程序的文件复制到已发布的位置 。