У меня есть проект net6.0, в котором для <LangVersion>
установлено значение latest
, что позволяет нам использовать новейшие функции C# (теперь я понимаю, что это, вероятно, плохая практика?).
Все это прекрасно собирается из Visual Studio, но не удается создать образ Docker (я использую поддержку Docker в Visual Studio для создания файла Dockerfile).
Неудивительно, что я получаю множество ошибок, таких как:
error CS1525: Invalid expression term '['
Я попытался обновить образы dotnet, используемые в Dockerfile, до версии 8.0
, т.е.
FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base
и FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
: он собирается нормально, но контейнер выходит из строя во время выполнения You must install or update .NET to run this application.
(опять же, что неудивительно)
Конечно, я мог бы обновить проект до net8.0 или удалить некоторые из этих функций C# 12.0, но это не идеально (мне нравятся эти скобки инициализации массива :)). Есть ли еще варианты, на которые я могу обратить внимание? Например, принудительное использование определенной версии MsBuild в образе Docker net6.0, чтобы он мог обрабатывать последнюю версию C#?
Я разрабатываю на платформе Windows, но для Docker нацелена на ОС Linux (если это имеет значение?)
Обратите внимание, насколько это полезно, но вот свойства моего csproj:
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<LangVersion>latest</LangVersion>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
</PropertyGroup>
Я предполагаю, что ошибка, которую вы получаете после обновления образа докера до .net 8, связана с тем, что вы запускаете приложение .net 6 на .net8. Итак, если это приемлемо, другой вариант — разрешить запуск приложения .net 6 на .net 8, установив roll forwarding
(Learn.microsoft.com/en-us/dotnet/core/versions/…)
Все это прекрасно собирается из Visual Studio, но не удается создать образ Docker (я использую поддержку Docker в Visual Studio для создания файла Dockerfile).
Это происходит потому, что по умолчанию SDK использует последнюю установленную версию, поэтому, поскольку у вас установлен .NET 8, вы можете использовать новейшие функции языка. А новые SDK могут создавать проекты для старых версий платформы.
Я попытался обновить образы dotnet, используемые в файле Dockerfile, до версии 8.0, т. е. ИЗ базы AS mcr.microsoft.com/dotnet/runtime:8.0 и ИЗ сборки AS mcr.microsoft.com/dotnet/sdk:8.0:
Попробуйте изменить только образ build
, вы все еще создаете проект .NET 6, и вам необходимо использовать соответствующую среду выполнения, приложения, зависящие от платформы, поддерживают только прокрутку второстепенной версии, поэтому ваш образ base
все равно должен быть runtime:6.0
.
Теперь я понимаю, что это, вероятно, плохая практика?
Возможно, это не очень хорошо. Существует как минимум два типа языковых функций/изменений с точки зрения компилятора: «синтаксический сахар», который не требует «прямых» изменений/поддержки во время выполнения, и «другие», которые требуют. И невооруженным глазом не так-то просто определить, кто из них какой. Если вы используете второй тип языковых функций, вы не сможете запустить его в более старой среде выполнения (на самом деле существует третий тип языковых функций, который требует определения некоторого типа для работы компилятора, например, см. Как для устранения ошибки «Атрибут NotNullWhen недоступен из-за уровня его защиты»).
Да, это работает! Большое спасибо! изменение среды выполнения на 6.0 и обновление SDK до 8.0
Я не думаю, что видел, чтобы люди раньше смешивали версии .NET и C#, и я не думаю, что образы MS SDK поддерживают это. Возможно, вы сможете создать собственный образ с установленными SDK 6.0 и 8.0. Или вы можете перенести свое приложение на .NET 8. Последний вариант, вероятно, лучший вариант.