Установка версии языка C#, используемой Docker для сборки моего проекта

У меня есть проект 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 и C#, и я не думаю, что образы MS SDK поддерживают это. Возможно, вы сможете создать собственный образ с установленными SDK 6.0 и 8.0. Или вы можете перенести свое приложение на .NET 8. Последний вариант, вероятно, лучший вариант.

Hans Kilian 26.06.2024 11:16

Я предполагаю, что ошибка, которую вы получаете после обновления образа докера до .net 8, связана с тем, что вы запускаете приложение .net 6 на .net8. Итак, если это приемлемо, другой вариант — разрешить запуск приложения .net 6 на .net 8, установив roll forwarding (Learn.microsoft.com/en-us/dotnet/core/versions/…)

Vagaus 26.06.2024 13:25
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Все это прекрасно собирается из 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

harveyAJ 27.06.2024 11:10

Другие вопросы по теме