Resolver erros .NET relacionados com ficheiros em falta no Linux
Quando tenta utilizar o .NET no Linux, comandos como dotnet new
e dotnet run
podem falhar com uma mensagem relacionada com um ficheiro que não está a ser encontrado, como fxr, libhostfxr.soou FrameworkList.xml. Algumas das mensagens de erro podem ser semelhantes aos seguintes itens:
System.IO.FileNotFoundException
System.IO.FileNotFoundException: Não foi possível localizar o ficheiro '/usr//share/dotnet/packs/Microsoft.NETCore.App.Ref/5.0.0/data/FrameworkList.xml'.
Ocorreu um erro fatal.
Ocorreu um erro fatal. Não foi possível encontrar a biblioteca libhostfxr.so necessária.
ou
Ocorreu um erro fatal. A pasta [/usr/share//dotnethost/fxr] não existe.
ou
Ocorreu um erro fatal, a pasta [/usr//share/dotnethost/fxr] não contém nenhuma pasta subordinada numerada por versão.
Mensagens genéricas sobre dotnet não encontradas
Pode ser apresentada uma mensagem geral que indica que o SDK não foi encontrado ou que o pacote já foi instalado.
Um dos sintomas destes problemas é que as /usr/lib64/dotnet
pastas e /usr/share/dotnet
estão no seu sistema.
Dica
Utilize o dotnet --info
comando para listar que SDKs e Runtimes estão instalados. Para obter mais informações, veja Como verificar se o .NET já está instalado.
O que se passa?
Normalmente, estes erros ocorrem quando dois repositórios de pacotes linux fornecem pacotes .NET. Embora a Microsoft forneça um repositório de pacotes Linux para pacotes .NET de origem, algumas distribuições do Linux também fornecem pacotes .NET, tais como:
- Alpine Linux
- Arco
- CentOS
- CentOS Stream
- Fedora
- RHEL
- Ubuntu 22.04+
A combinação de pacotes .NET de duas origens diferentes irá provavelmente originar problemas, uma vez que os pacotes podem colocar as coisas em caminhos diferentes e podem ser compilados de forma diferente.
Soluções
A solução para estes problemas é utilizar o .NET a partir de um repositório de pacote. O repositório a escolher e como fazê-lo varia consolho de utilização e distribuição do Linux.
- A minha distribuição do Linux fornece pacotes .NET e quero utilizá-los.
- Preciso de uma versão do .NET que não seja fornecida pela minha distribuição do Linux.
A minha distribuição do Linux fornece pacotes .NET e quero utilizá-los
Utiliza o repositório da Microsoft para outros pacotes, como o PowerShell e o MSSQL?
Sim
Configure o gestor de pacotes para ignorar os pacotes .NET do repositório da Microsoft. É possível que tenha instalado o .NET a partir de ambos os repositórios, pelo que pretende escolher um ou outro.
Remova os pacotes .NET existentes da sua distribuição. Quer recomeçar e garantir que não os instala a partir do repositório errado.
sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
Configure o repositório da Microsoft para ignorar pacotes .NET.
echo 'excludepkgs=dotnet*,aspnet*,netstandard*' | sudo tee -a /etc/yum.repos.d/microsoft-prod.repo
Reinstale o .NET a partir do feed de pacotes da distribuição. Para obter mais informações, consulte Instalar o .NET no Linux.
Não
Remova os pacotes .NET existentes da sua distribuição. Quer recomeçar e garantir que não os instala a partir do repositório errado.
sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
Elimine o feed de repositório da Microsoft da sua distribuição.
sudo dnf remove packages-microsoft-prod
Reinstale o .NET a partir do feed de pacotes da distribuição. Para obter mais informações, consulte Instalar o .NET no Linux.
Utiliza o repositório da Microsoft para outros pacotes, como o PowerShell e o MSSQL?
Sim
Configure o gestor de pacotes para ignorar os pacotes .NET do repositório da Microsoft. É possível que tenha instalado o .NET a partir de ambos os repositórios, pelo que pretende escolher um ou outro.
Remova os pacotes .NET existentes da sua distribuição. Quer recomeçar e garantir que não os instala a partir do repositório errado.
sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
Crie
/etc/apt/preferences
, se ainda não existir.touch /etc/apt/preferences
Abra
/etc/apt/preferences
num editor e adicione as seguintes definições, o que impede que os pacotes que começam comdotnet
,aspnetcore
ounetstandard
sejam obtidos a partir do repositório da Microsoft:Package: dotnet* aspnet* netstandard* Pin: origin "packages.microsoft.com" Pin-Priority: -10
Reinstale o .NET a partir do feed de pacotes da distribuição. Para obter mais informações, consulte Instalar o .NET no Linux.
Não
Remova os pacotes .NET existentes da sua distribuição. Quer recomeçar e garantir que não os instala a partir do repositório errado.
sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
Elimine o feed de repositório da Microsoft da sua distribuição.
sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list sudo apt update
Reinstale o .NET a partir do feed de pacotes da distribuição. Para obter mais informações, consulte Instalar o .NET no Linux.
Preciso de uma versão do .NET que não seja fornecida pela minha distribuição do Linux
Configure o gestor de pacotes para ignorar os pacotes .NET do repositório da distribuição. É possível que tenha instalado o .NET a partir de ambos os repositórios, pelo que pretende escolher um ou outro.
Remova os pacotes .NET existentes da sua distribuição. Quer recomeçar e garantir que não os instala a partir do repositório errado.
sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
Configure o repositório do Linux para ignorar pacotes .NET.
echo 'excludepkgs=dotnet*,aspnet*,netstandard*' | sudo tee -a /etc/yum.repos.d/<your-package-source>.repo
Certifique-se de que substitui
<your-package-source>
pela origem do pacote de distribuição.Reinstale o .NET a partir do feed de pacotes da distribuição. Para obter mais informações, consulte Instalar o .NET no Linux.
Configure o gestor de pacotes para ignorar os pacotes .NET do repositório da distribuição. É possível que tenha instalado o .NET a partir de ambos os repositórios, pelo que pretende escolher um ou outro.
Remova os pacotes .NET existentes da sua distribuição. Quer recomeçar e garantir que não os instala a partir do repositório errado.
sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
Crie
/etc/apt/preferences
, se ainda não existir.touch /etc/apt/preferences
Abra
/etc/apt/preferences
num editor e adicione as seguintes definições, o que impede que os pacotes que começam comdotnet
,aspnetcore
ounetstandard
sejam obtidos a partir do repositório da distribuição.Package: dotnet* aspnet* netstandard* Pin: origin "<your-package-source>" Pin-Priority: -10
Certifique-se de que substitui
<your-package-source>
pela origem do pacote de distribuição, por exemplo, no Ubuntu que utilizariaarchive.ubuntu.com
.Reinstale o .NET a partir do feed de pacotes da Microsoft. Para obter mais informações, consulte Instalar o .NET no Linux. Se utilizar o Ubuntu, consulte A minha distribuição Ubuntu não inclui a versão .NET pretendida ou preciso de uma versão .NET sem suporte.
Referências online
Muitos outros utilizadores reportaram estes problemas. Segue-se uma lista desses problemas. Pode lê-las para obter informações sobre o que pode estar a acontecer:
System.IO.FileNotFoundException e "/usr//share/dotnet/packs/Microsoft.NETCore.App.Ref/5.0.0/data/FrameworkList.xml"
- SDK #15785: não é possível criar um novo projeto depois de atualizar para a versão 5.0.3
- SDK #15863: "MsB4018 ResolveTargetingPackAssets task failed unexpectedly" after updating to 5.0.103
- SDK #17411: dotnet erro de compilação sempre a lançar
- SDK #12075: dotnet 3.1.301 no Fedora 32 não consegue encontrar FrameworkList.xml porque não existe
Erro fatal: libhostfxr.so não foi possível encontrar
Erro fatal: a pasta /anfitrião/fxr não existe
Erro fatal: a pasta /anfitrião/fxr não contém nenhuma pasta subordinada numerada por versão
Erros genéricos sem mensagens claras