Невозможно запустить проект функции Azure в Rider (Mint/Ubuntu)

У меня есть крупное решение, состоящее из всего кода .net8, работающего в Rider в среде Ubuntu/Mint Linux.

API работает нормально, но функция не запускается. Когда я запускаю их, я получаю следующее сообщение...

/home/{myname}/.AzureToolsForIntelliJ/AzureFunctionsCoreTools/v4/4.72.0/func host start --pause-on-error
dotnet sdk is required for dotnet based functions. Please install
Press any key to continue....

У меня установлен SDK .net8 (иначе несколько других проектов не работали бы) с помощью скрипта dotnet-install.

Что мне здесь не хватает?

Запуск dotnet --list-sdks дает мне следующее...

6.0.410 [/home/{myname}/.dotnet/sdk]
7.0.304 [/home/{myname}/.dotnet/sdk]
8.0.100 [/home/{myname}/.dotnet/sdk]
8.0.204 [/home/{myname}/.dotnet/sdk]

ПРИМЕЧАНИЕ. Обновлено до последней версии net 8, чтобы посмотреть, имеет ли это какое-либо значение (это не так).

Вот *.csproj (если это поможет)

<Project Sdk = "Microsoft.NET.Sdk">
  
  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <AzureFunctionsVersion>v4</AzureFunctionsVersion>
    <OutputType>Exe</OutputType>
    <UserSecretsId>my-function</UserSecretsId>
  </PropertyGroup>
  
  <ItemGroup>
    <FrameworkReference Include = "Microsoft.AspNetCore.App" />
    <PackageReference Include = "Microsoft.Azure.Functions.Worker" Version = "1.21.0" />
    <PackageReference Include = "Microsoft.Azure.Functions.Worker.Extensions.CosmosDB" Version = "4.8.0" />
    <PackageReference Include = "Microsoft.Azure.Functions.Worker.Extensions.Http" Version = "3.1.0" />
    <PackageReference Include = "Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore" Version = "1.2.1" />
    <PackageReference Include = "Microsoft.Azure.Functions.Worker.Sdk" Version = "1.17.2" />
    <PackageReference Include = "Microsoft.ApplicationInsights.WorkerService" Version = "2.22.0" />
    <PackageReference Include = "Microsoft.Azure.Functions.Worker.ApplicationInsights" Version = "1.2.0" />
    <PackageReference Include = "Microsoft.Extensions.Configuration.UserSecrets" Version = "8.0.0" />
    <PackageReference Include = "Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version = "1.20.1" />
  </ItemGroup>
  
  <ItemGroup>
    <None Update = "host.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update = "local.settings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </None>
  </ItemGroup>
  
  <ItemGroup>
    <Using Include = "System.Threading.ExecutionContext" Alias = "ExecutionContext" />
  </ItemGroup>
  
</Project>

мой host.json....

{
    "version": "2.0",
    "logging": {
        "applicationInsights": {
            "samplingSettings": {
                "isEnabled": true,
                "excludedTypes": "Request"
            },
            "enableLiveMetricsFilters": true
        }
    }
}

Мой local.settings.json...

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "APPLICATIONINSIGHTS_CONNECTION_STRING": "",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated"
  }
}

У меня есть контейнеры Docker, на которых работают Azurite и Cosmos. Один из Cosmos работает нормально, но конфигурация контейнера Azurite может быть неправильной, но такое ощущение, что я еще не так уж далеко продвинулся в цепочке выполнения.

Если я попытаюсь запустить его в сообщении отладки, я получу всплывающее сообщение в Rider, которое может быть полезным...

Azure Functions host did not return isolated worker process id. Could not attach the debugger. Check the process output for more information.

Функция изначально была создана в Visual Studio, поэтому я попытался исключить любые локальные различия в среде, создав пустое приложение-функцию в Rider для тестирования, и я получил точно такой же результат с базовым триггером таймера.

Я попытался создать сценарий оболочки в корне функции, чтобы запустить следующее и выполнить его в командной строке...

/home/keith/.AzureToolsForIntelliJ/AzureFunctionsCoreTools/v4/4.72.0/func host start --pause-on-error --verbose

Это ДЕЙСТВИТЕЛЬНО работает, что говорит о том, что со стороны Райдера что-то не так.

Проверьте установленные версии Dotnet SDK с помощью dotnet --list-sdks.

Pravallika KV 19.04.2024 15:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
308
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Я считаю, что нашел основную (каламбур не предназначен) причину, по которой Rider не может запустить функции.

Если я выполняю в командной строке с помощью sudo, а не от себя, я получаю ту же ошибку.

sudo /home/{myname}/.AzureToolsForIntelliJ/AzureFunctionsCoreTools/v4/4.72.0/func host start --pause-on-error --verbose   
[sudo] password for {myname}:         
dotnet sdk is required for dotnet based functions. Please install https://microsoft.com/net
Press any key to continue....

В данном контексте это не работает, поскольку пакеты SDK для dotnet установлены в моем профиле пользователя с помощью сценария dotnet-install.sh.

Райдер явно пытается выполнить функцию с повышенными привилегиями, но, поскольку у меня не установлен SDK dotnet 8 как «общемашинный», по понятным причинам терпит неудачу.

sudo dotnet --list-sdks      
sudo: dotnet: command not found

Похоже, проблема заключалась в использовании сценария dotnet-install.sh или в том месте, где он устанавливает SDK по умолчанию. Я установил пакеты SDK 6 и 8 напрямую (это может оказаться неподходящим вариантом для некоторых дистрибутивов — раньше я работал в Arch, а пакеты dotnet AUR не самые надежные)...

sudo apt-get install dotnet-sdk-6.0
sudo apt-get install dotnet-sdk-8.0

Затем мне пришлось пройти немного странный шаг: после установки в моем домашнем каталоге была установлена ​​локальная пользовательская копия...

dotnet --list-sdks

8.0.203 [/home/{myname}/.dotet/sdk

У меня было 8.0.204 при запуске sudo и 8.0.203 по другому пути при прямом доступе. Я просто добавил rm -rf ~/.dotnet, и все вернулось на круги своя.

Тогда результаты будут выглядеть гораздо лучше, чем ожидалось:

sudo dotnet --list-sdks

6.0.421 [/usr/share/dotnet/sdk]
8.0.204 [/usr/share/dotnet/sdk]

dotnet --list-sdks

6.0.421 [/usr/share/dotnet/sdk]
8.0.204 [/usr/share/dotnet/sdk]

В качестве окончательной очистки я просмотрел свой .zshrc (или .bashrc в зависимости от выбранной вами оболочки) и обновил настройки PATH, чтобы указать новые пути и корни...

export PATH=$PATH:/usr/share/dotnet:/usr/share/dotnet/tools
export DOTNET_ROOT = "/usr/share/dotnet"

После всего вышеперечисленного мои приложения-функции будут работать, но мои API и веб-проекты больше не будут работать. Похоже, они искали dotnet в /usr/lib/dotnet. Я решил это, объединив два пути вместе...

sudo ln -s /usr/share/dotnet /usr/lib/dotnet

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