Подтвердить что ты не робот

Можно ли опубликовать приложение ASP.NET 5 таким образом, чтобы целевой машине не требовалось установить DNX?

Из wiki для основного "aspnet" репозитория GitHub:

"DNX - это SDK, содержащий все биты, необходимые для сборки и запуска приложение, включая CLR в случае Core CLR. Может быть bin, развернутый с вашим приложением...".

Я немного смущен тем, что это на самом деле означает. Основываясь на этом описании и других комментариях, которые я видел в сообщениях Microsoft и сообщениях в блогах, казалось бы, вы могли бы принять приложение ASP.NET 5 и создать автономный пакет без внешних зависимостей. В комплект поставки входит ваш код, бегун DNX, 11 мегабайт CoreCLR и любые другие зависимости NuGet, которые вы можете использовать. "Все биты, необходимые для запуска вашего приложения", готовые к удалению на чистую целевую машину сланца.

Однако, когда я использую dnu publish, это не то, что происходит. Получающийся пакет содержит мой код и DLL для частей стандартной библиотеки, которые я фактически использую. Тем не менее, он не тянет во весь CoreCLR... и это, конечно, не тянет в DNX. Команда run из моего файла project.json превращается в пакетный файл 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)
4b9b3361

Ответ 1

В теории вы должны иметь возможность развернуть свое приложение на машине, где даже .NET Framework не установлена, но я помню, что даже dnxcore имеет некоторые зависимости .NET Framework сегодня и позже уйдет (я мог ошибаться, стоит попробовать это).

Предполагая, что это есть, и вы хотите достичь этого, вы действительно должны использовать переключатель --runtime, и вам нужно иметь активную конструкцию, если вы собираетесь передать active как значение.

Например:

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

Это должно объединить время выполнения вместе с вашим приложением.