是否可以发布 ASP.NET 5 应用程序,使目标机器不需要安装 DNX?
Can an ASP.NET 5 application be published such that the target machine doesn't need DNX installed?
来自wiki for the main "aspnet" GitHub repo:
"The DNX is an SDK containing all of the bits needed to build and run
an application, including the CLR in the case of Core CLR. It can be
bin deployed with your application...".
我有点不明白这到底是什么意思。根据此描述以及我在 Microsoft 公告和博客文章中看到的其他评论,您似乎可以采用 ASP.NET 5 应用程序并创建一个没有外部依赖项的独立包。该捆绑包将包括您的代码、DNX 运行程序、约 11 兆字节的 CoreCLR 以及您可能使用的任何其他 NuGet 依赖项。 "All the bits needed to run your application",已准备好投放到全新的目标计算机上。
但是,当我使用 dnu publish
时,情况并非如此。生成的包包含我的代码,以及我实际使用的标准库部分的 DLL。但是,它并没有引入整个 CoreCLR……当然也没有引入 DNX。我的 project.json
文件中的 run
命令变成了一个 run.cmd
批处理文件,如下所示:
@"dnx.exe" --appbase "%~dp0approot\src\ConsoleApplication" Microsoft.Framework.ApplicationHost run %*
...表明 DNX 应该已经安装在目标系统上,在此包之外。
我是不是漏掉了一些基本的东西?如果您需要在目标系统上安装 DNX,那么我完全不确定这种方法提供了哪些优势。是否可以采取额外的步骤来发布一个完全内置 DNX 和 CoreCLR 且独立的包?
我看到 dnu publish
有一个可选的 --native
参数,但我不确定这是否相关。该参数希望您指定一个运行时。当我使用 "clr" 时,我收到错误消息“Native image generation is only supported for .NET Core flavors
”。当我使用 "coreclr" 时,我得到这个丑陋的堆栈跟踪:
C:\Users\Steve\Desktop\ConsoleApplication>dnu publish --native --runtime active
System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.Framework.Project, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.
File name: 'Microsoft.Framework.Project, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' ---> System.IO.FileNotFoundException: Could not load the specified file.
File name: 'Microsoft.Framework.Project'
at System.Runtime.Loader.AssemblyLoadContext.LoadFromAssemblyName(AssemblyName assemblyName)
at System.Runtime.Loader.AssemblyLoadContext.Resolve(IntPtr gchManagedAssemblyLoadContext, AssemblyName assemblyName)
at Microsoft.Framework.PackageManager.Publish.NativeImageGenerator.<>c.<Create>b__4_0(String r)
at System.Linq.Lookup`2.Create[TSource](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
at System.Linq.GroupedEnumerable`3.GetEnumerator()
at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()
at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source)
at Microsoft.Framework.PackageManager.Publish.NativeImageGenerator.Create(PublishOptions options, PublishRoot root, IEnumerable`1 contexts)
at Microsoft.Framework.PackageManager.Publish.PublishManager.Publish()
at Microsoft.Framework.PackageManager.Program.<>c__DisplayClass3_2.<Main>b__4()
at Microsoft.Framework.Runtime.Common.CommandLine.CommandLineApplication.Execute(String[] args)
at Microsoft.Framework.PackageManager.Program.Main(String[] args)
System.IO.FileNotFoundException: Could not load the specified file.
File name: 'Microsoft.Framework.Project'
at System.Runtime.Loader.AssemblyLoadContext.LoadFromAssemblyName(AssemblyName assemblyName)
at System.Runtime.Loader.AssemblyLoadContext.Resolve(IntPtr gchManagedAssemblyLoadContext, AssemblyName assemblyName)
理论上,您应该能够将您的应用程序部署到一台甚至没有安装 .NET Framework 的机器上,但我记得听说即使是 dnxcore 今天也有一些 .NET Framework 依赖项,稍后会消失(我可以弄错了,值得一试。
假设这是存在的并且你想实现它,你确实应该使用 --runtime
开关,如果你要将 active
作为值传递,你需要激活 coreclr。
例如:
dnvm use 1.0.0-beta4 -r coreclr -p
Active Version Runtime Architecture Location Al
ia
s
------ ------- ------- ------------ -------- --
1.0.0-beta4 clr x64 C:\Users\Tugberk\.dnx\runtimes
1.0.0-beta4 clr x86 C:\Users\Tugberk\.dnx\runtimes
1.0.0-beta4 coreclr x64 C:\Users\Tugberk\.dnx\runtimes
* 1.0.0-beta4 coreclr x86 C:\Users\Tugberk\.dnx\runtimes
这应该将运行时与您的应用程序捆绑在一起。
来自wiki for the main "aspnet" GitHub repo:
"The DNX is an SDK containing all of the bits needed to build and run an application, including the CLR in the case of Core CLR. It can be bin deployed with your application...".
我有点不明白这到底是什么意思。根据此描述以及我在 Microsoft 公告和博客文章中看到的其他评论,您似乎可以采用 ASP.NET 5 应用程序并创建一个没有外部依赖项的独立包。该捆绑包将包括您的代码、DNX 运行程序、约 11 兆字节的 CoreCLR 以及您可能使用的任何其他 NuGet 依赖项。 "All the bits needed to run your application",已准备好投放到全新的目标计算机上。
但是,当我使用 dnu publish
时,情况并非如此。生成的包包含我的代码,以及我实际使用的标准库部分的 DLL。但是,它并没有引入整个 CoreCLR……当然也没有引入 DNX。我的 project.json
文件中的 run
命令变成了一个 run.cmd
批处理文件,如下所示:
@"dnx.exe" --appbase "%~dp0approot\src\ConsoleApplication" Microsoft.Framework.ApplicationHost run %*
...表明 DNX 应该已经安装在目标系统上,在此包之外。
我是不是漏掉了一些基本的东西?如果您需要在目标系统上安装 DNX,那么我完全不确定这种方法提供了哪些优势。是否可以采取额外的步骤来发布一个完全内置 DNX 和 CoreCLR 且独立的包?
我看到 dnu publish
有一个可选的 --native
参数,但我不确定这是否相关。该参数希望您指定一个运行时。当我使用 "clr" 时,我收到错误消息“Native image generation is only supported for .NET Core flavors
”。当我使用 "coreclr" 时,我得到这个丑陋的堆栈跟踪:
C:\Users\Steve\Desktop\ConsoleApplication>dnu publish --native --runtime active
System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.Framework.Project, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.
File name: 'Microsoft.Framework.Project, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' ---> System.IO.FileNotFoundException: Could not load the specified file.
File name: 'Microsoft.Framework.Project'
at System.Runtime.Loader.AssemblyLoadContext.LoadFromAssemblyName(AssemblyName assemblyName)
at System.Runtime.Loader.AssemblyLoadContext.Resolve(IntPtr gchManagedAssemblyLoadContext, AssemblyName assemblyName)
at Microsoft.Framework.PackageManager.Publish.NativeImageGenerator.<>c.<Create>b__4_0(String r)
at System.Linq.Lookup`2.Create[TSource](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
at System.Linq.GroupedEnumerable`3.GetEnumerator()
at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()
at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source)
at Microsoft.Framework.PackageManager.Publish.NativeImageGenerator.Create(PublishOptions options, PublishRoot root, IEnumerable`1 contexts)
at Microsoft.Framework.PackageManager.Publish.PublishManager.Publish()
at Microsoft.Framework.PackageManager.Program.<>c__DisplayClass3_2.<Main>b__4()
at Microsoft.Framework.Runtime.Common.CommandLine.CommandLineApplication.Execute(String[] args)
at Microsoft.Framework.PackageManager.Program.Main(String[] args)
System.IO.FileNotFoundException: Could not load the specified file.
File name: 'Microsoft.Framework.Project'
at System.Runtime.Loader.AssemblyLoadContext.LoadFromAssemblyName(AssemblyName assemblyName)
at System.Runtime.Loader.AssemblyLoadContext.Resolve(IntPtr gchManagedAssemblyLoadContext, AssemblyName assemblyName)
理论上,您应该能够将您的应用程序部署到一台甚至没有安装 .NET Framework 的机器上,但我记得听说即使是 dnxcore 今天也有一些 .NET Framework 依赖项,稍后会消失(我可以弄错了,值得一试。
假设这是存在的并且你想实现它,你确实应该使用 --runtime
开关,如果你要将 active
作为值传递,你需要激活 coreclr。
例如:
dnvm use 1.0.0-beta4 -r coreclr -p
Active Version Runtime Architecture Location Al ia s ------ ------- ------- ------------ -------- -- 1.0.0-beta4 clr x64 C:\Users\Tugberk\.dnx\runtimes 1.0.0-beta4 clr x86 C:\Users\Tugberk\.dnx\runtimes 1.0.0-beta4 coreclr x64 C:\Users\Tugberk\.dnx\runtimes * 1.0.0-beta4 coreclr x86 C:\Users\Tugberk\.dnx\runtimes
这应该将运行时与您的应用程序捆绑在一起。