Задать вопрос
@ATauenis

Как собрать лёгкую сборку приложения .NET Core?

Раньше на .NET Framework сборка релизовой версии программы делалась очень просто. Выбрать конфигурацию Release/Any CPU, и нажать Build. Всё. Дальше можно зиповать папку Bin/Release, удалить pdb файлы, и получался готовый дистрибутив. Его можно уже упаковывать в инсталлятор, либо распространять в виде zip архива.

Что же с .NET Core? Если делать таким же макаром, вылезает куча "лишних" dll и json файлов. Но, в целом, они весят не то, чтобы совсем много, можно тоже скопировать их в архив с релизом.

Вычитал, что в .NET Core можно собирать экзешники через dotnet publish, причём сразу можно сделать бинарники и под альтернативные платформы. Всё бы ничего, но полученные папки "для публикации" выходят совсем тяжёлыми - под 200 мегабайт для программки весом в 0,2 МБ!!! Это уж слишком жирно, по ADSL люди будут качать вечность (а есть и такие жертвы капитализма, до сих пор).

Есть цивильные методы, чтобы обкорнать дистрибутив программы до вменяемого веса? Кроме как удалять по файлу, и смотреть, заведётся или нет где-нибудь на чистой ОС.

Особенно это меня волнует потому, что нашёл хороший плагин к SDK, https://github.com/qmfrederik/dotnet-packaging/ . Им можно сразу получать deb/rpm пакеты для Linux и zip архивы для Windows. Но он, гад, использует тот же dotnet publish, и просто архивирует его выдачу (и дополняет .deb пакеты директивами из .csproj файла). Хочется, чтобы архивы не содержали в себе весь .NET Core целиком. Тем более, что на Linux его в любом случае если что докачает пакетный менеджер.
  • Вопрос задан
  • 1859 просмотров
Подписаться 3 Простой 13 комментариев
Решения вопроса 1
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Ой вэй. Совет в общем то простой убирайте зависимости это относится ко всяким рослинам, генераторам для EF и прочему стафу который цепляет студия. Плюс в настройках паблишинга есть вариант публиковать полную версию или версию для уже установленного фреймворка.

https://docs.microsoft.com/ru-ru/dotnet/core/deploying/

Кроме этого можно скопировать 1 раз файлы, а после просто заменять dll

Или же вариант создать инсталлер, который устанавливает фреймворк по необходимости.
Например WiX installer

Вот рабочий код без всякого мусора.

dotnet build -c Release-no-self
dotnet zip --no-restore -c Release-no-self


<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <RootNamespace>_444</RootNamespace>
    <Configurations>Debug;Release;Release-no-self</Configurations>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <DebugType>pdbonly</DebugType>
    <DebugSymbols>true</DebugSymbols>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release-no-self|AnyCPU'">
    <SelfContained>False</SelfContained>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Packaging.Targets" Version="$(PackagingNuGetVersion)" />
  </ItemGroup>

  <PropertyGroup>
    <PostInstallScript>
    </PostInstallScript>
    <PostRemoveScript>
    </PostRemoveScript>
  </PropertyGroup>

  <Target Name="PackageZip" DependsOnTargets="CreateZip" Outputs="$(ZipPath)"/>
  <Target Name="PackageTarball" DependsOnTargets="CreateTarball" Outputs="$(TarballPath)"/>
  <Target Name="PackageDebian" DependsOnTargets="CreateDeb" Outputs="$(DebPath)"/>
  <Target Name="PackageRpm" DependsOnTargets="CreateRpm" Outputs="$(RpmPath)"/>

</Project>
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
freeExec
@freeExec
Участник OpenStreetMap
но полученные папки "для публикации" выходят совсем тяжёлыми - под 200 мегабайт для программки весом в 0,2 МБ!!!

Так в варианте с .NET Framework надо прежде скачать этот фреймворк на 400Мб и установить. Без него не будет работать. Поэтому утверждение, что программа весит 0.2Мб не верное.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы