@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 его в любом случае если что докачает пакетный менеджер.
  • Вопрос задан
  • 1807 просмотров
Решения вопроса 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Мб не верное.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
05 нояб. 2024, в 19:14
100000 руб./за проект
05 нояб. 2024, в 19:07
12000 руб./за проект
05 нояб. 2024, в 17:38
150000 руб./за проект