У меня есть крупное решение, состоящее из всего кода .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
Это ДЕЙСТВИТЕЛЬНО работает, что говорит о том, что со стороны Райдера что-то не так.





Я считаю, что нашел основную (каламбур не предназначен) причину, по которой 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
Проверьте установленные версии Dotnet SDK с помощью
dotnet --list-sdks.