Построение приложения .NET Core через командную строку, чтобы он работал на компьютере без установленного .NET Core
Моя конечная цель - создать кросс-платформенное (не web-приложение) консольное приложение, поэтому я сейчас изучаю .NET Core.
В моих предыдущих проектах .NET я сделал всю разработку внутри Visual Studio, но я также создал файл пакета /MSBuild, чтобы я мог построить весь проект (включая установки, пакеты NuGet, zip файлы с двоичными файлами и т.д.) с один клик. Вот пример из предыдущего проекта.
В конце концов, я хочу сделать что-то подобное с моим тестовым проектом .NET Core.
Но сейчас я не могу выполнить первый шаг: я не могу создать его за пределами Visual Studio, так что результат будет работать на другом компьютере под управлением Windows без установки .NET Core.
(на первом этапе я игнорирую кросс-платформенную часть - я буду рад заставить ее работать в Windows)
Что у меня
Мне удалось заставить его работать внутри Visual Studio 2015 Community Edition следующим образом:
Здесь мой тестовый проект на GitHub.
Когда я снова создаю "Build" ⇒ "Опубликовать" в меню, Visual Studio, по-видимому, снова запустит ранее созданный PowerShell script.
Результат чуть более 90 МБ, состоит из 825 файлов в 598 папках и выглядит примерно так:
![Результат публикации Visual Studio]()
Когда я копирую его на другой компьютер (установлен Win 7/.NET 4/.NET Core не), он работает.
Что я попытался получить за пределами Visual Studio
1. dotnet publish
Этот ответ и этот ответ звучит так, как будто я могу использовать 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 МБ, все в одной папке:
![результат публикации dotnet]()
Очевидно, что среда выполнения .NET Core отсутствует здесь, и, как ожидалось, это приложение выходит из строя, когда я пытаюсь выполнить его на компьютере без установленной .NET Core (такой же, как указано выше).
2. The Powershell script из профиля публикации
Я попытался выполнить Powershell script (который был создан, когда я создал профиль публикации) за пределами Visual Studio, но он потерпел неудачу, потому что script ожидает некоторые параметры, и я не знаю, что передать:
param($publishProperties, $packOutput, $nugetUrl)
В этой строке также находится строка script:
# to learn more about this file visit http://go.microsoft.com/fwlink/?LinkId=524327
... но ссылка просто указывает на целевую страницу в блоге .NET Web Development and Tools.
TL; DR
Что я делаю неправильно?
Я знаю, что первый выпуск .NET Core в основном фокусируется на ASP.NET, но, как я понял, приложения ASP.NET Core просто консольные приложения, поэтому я подумал, что теперь будет работать базовое консольное приложение. < ш > С другой стороны, большая часть консольного приложения "начало работы" docs по-прежнему отсутствует, поэтому, возможно, это слишком рано и dotnet publish
для консольные приложения еще не закончены?
Редактировать через несколько дней: я подозреваю, что я не делаю ничего плохого и что это проблема в инструментах командной строки .NET Core, поэтому я отправил его в средство отслеживания проблем командной строки.
Ответы
Ответ 1
Проблема решена!
Я разместил его на отслеживании проблем в инструментах командной строки .NET Core, и оказалось, что это была ошибка в dotnet publish
- она не связывает С++, которая необходима для выполнения скомпилированного приложения на компьютере без установки .NET Core.
Ответ 2
Для dnu
:
Есть опция для dnu publish
, называемая --runtime
, которая указывает время выполнения, которое будет включено при публикации. Вы должны использовать полное имя времени выполнения с помощью команды, например:
dnu publish --runtime dnx-clr-win-x86.1.0.0-rc1
Для dotnet
:
Вам не нужно указывать версии исполнения или фреймворка - по умолчанию dotnet publish
будет использовать фреймворк с project.json
и текущий вкус во время выполнения. Однако в документации указано, что:
Команда dotnet-publish также требует определенных зависимостей в project.json для работы. А именно пакет Microsoft.NETCore.Runtime должен ссылаться как зависимость, чтобы команда могла скопировать файлы времени выполнения, а также файлы приложений в опубликованное местоположение.