Как определить, что сборка является Single-file?
В .NET Core (вроде с 3-ей версии) есть так называемый Single-file Publish, который позволяет собрать весь проект в один выходной файл, который также может в себе содержать и сам .NET Core, что позволяет не устанавливать его у клиента.
Собственно в планах делать его "самообновляемым", но увы, не каждый в состояние качать "много" из интернета, у некоторых либо до сих пор трафик, либо скорость очень мала, либо еще ряд других проблем. А сам проект, если его собрать по такой технологии, начинает весить не 100кб, а 150мб++.
Для решения данной проблемы, было принято делать две публикации:
- Минимальная - не содержит в себе .NET Core и вес от 100кб
- Максимальная - в составе .NET Core, ну и вес 100мб и выше.
И тут уже пусть сами клиенты решают какой способ им удобней и что они хотят. НО! Как быть с автоматическим обновлением? Нужно понимать какая версия стоит у клиента.
Собственно вопрос: Как можно определить, "максимальная" у человека версия, или "минимальная"? Как узнать, есть ли в этом .exe файле сам .NET Сore?
Можно конечно попробовать по размеру определять, но это прям костыль какой-то. Можно записывать в файлик информацию, но тоже как по мне не то.
Ответы (1 шт):
Можно использовать DefineConstants для того, чтобы при сборке разных версий проекта указать какая это версии и на основании этого и выбирать тип обновления.
Например:
При сборке вызывать dotnet build -p:DefineConstants=SINGLEFILE ....
А в коде проверять это при помощи #if SINGLEFILE ....
Также можно эти все настройки поместить в *.csproj, чтобы каждый раз не указывать в консоли или при изменении не бегать по всем билд скриптам.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<!-- дефолтные опции, которые будет использоваться -->
<!-- для всех "типов" сборок -->
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)' == 'SINGLEFILE'">
<ConfigurationGroup>Release</ConfigurationGroup>
<DefineConstants>SINGLEFILE</DefineConstants>
<RuntimeIdentifier>osx-x64</RuntimeIdentifier>
<PublishSingleFile>true</PublishSingleFile>
<SelfContained>false</SelfContained>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)' == 'MAX'">
<ConfigurationGroup>Release</ConfigurationGroup>
<DefineConstants>MAX</DefineConstants>
<RuntimeIdentifier>osx-x64</RuntimeIdentifier>
<PublishSingleFile>true</PublishSingleFile>
<SelfContained>true</SelfContained>
</PropertyGroup>
</Project>
И теперь можно собирать это как обычный проект:
dotnet build- обычнаяDebugсоборка без каких либо оптимизаций и упаковокdotnet build -c SINGLEFILE- упаковка без.NET Coredotnet build -c MAX- упаковка с.NET Core