Solucionar erros do .NET relacionados a arquivos ausentes no Linux
Quando você tenta usar o .NET no Linux, comandos como dotnet new
e dotnet run
podem falhar com uma mensagem relacionada a um arquivo não 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 encontrar 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/dotnet/host/fxr] não existe.
ou
Ocorreu um erro fatal, a pasta [/usr/share/dotnet/host/fxr] não contém nenhuma pasta filha numerada por versão.
Mensagens genéricas sobre dotnet não encontrado
Pode aparecer uma mensagem geral indicando que o SDK não foi encontrado ou que o pacote já foi instalado.
Um sintoma desses problemas é que as pastas /usr/lib64/dotnet
e /usr/share/dotnet
estão no seu sistema.
Gorjeta
Use o dotnet --info
comando para listar quais SDKs e Runtimes estão instalados. Para obter mais informações, consulte Como verificar se o .NET já está instalado.
O que é que se passa
Importante
A partir do .NET 9, a Microsoft só publica pacotes para distribuições Linux suportadas que não publicam seus próprios pacotes. Para obter mais informações, consulte Instalar o .NET no Linux.
Esses erros geralmente ocorrem quando dois repositórios de pacotes Linux fornecem pacotes .NET. Enquanto a Microsoft fornece um repositório de pacotes Linux para pacotes .NET de origem, algumas distribuições Linux também fornecem pacotes .NET. Essas distribuições incluem:
- Linux alpino
- Arco
- Fluxo do CentOS
- Fedora
- RHEL
- Ubuntu 22.04+
Se você misturar pacotes .NET de duas fontes diferentes, provavelmente terá problemas. Os pacotes podem colocar as coisas em caminhos diferentes e podem ser compilados de forma diferente.
Soluções
A solução para esses problemas é usar o .NET de um repositório de pacotes. Qual repositório escolher, e como fazê-lo, varia de acordo com o caso de uso e a distribuição Linux.
- Minha distribuição Linux fornece pacotes .NET e eu quero usá-los.
- Preciso de uma versão do .NET que não seja fornecida pela minha distribuição Linux.
Minha distribuição Linux fornece pacotes .NET e eu quero usá-los
Você usa o repositório da Microsoft para outros pacotes, como PowerShell e MSSQL?
Sim
Configure seu gerenciador 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. Você quer começar de novo e garantir que não os instale 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. Você quer começar de novo e garantir que não os instale a partir do repositório errado.
sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
Exclua o feed do 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.
Você usa o repositório da Microsoft para outros pacotes, como PowerShell e MSSQL?
Sim
Configure seu gerenciador 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. Você quer começar de novo e garantir que não os instale a partir do repositório errado.
sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
Crie
/etc/apt/preferences
o , se ainda não existir.touch /etc/apt/preferences
Abra
/etc/apt/preferences
em um editor e adicione as seguintes configurações, o que impede que pacotes que comecem comdotnet
,aspnetcore
ounetstandard
sejam originados 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. Você quer começar de novo e garantir que não os instale a partir do repositório errado.
sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
Exclua o feed do 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 Linux
Configure seu gerenciador 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. Você quer começar de novo e garantir que não os instale a partir do repositório errado.
sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
Configure o repositório Linux para ignorar pacotes .NET.
echo 'excludepkgs=dotnet*,aspnet*,netstandard*' | sudo tee -a /etc/yum.repos.d/<your-package-source>.repo
Certifique-se de substituir
<your-package-source>
pela fonte do pacote da sua 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 seu gerenciador 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. Você quer começar de novo e garantir que não os instale a partir do repositório errado.
sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
Crie
/etc/apt/preferences
o , se ainda não existir.touch /etc/apt/preferences
Abra
/etc/apt/preferences
em um editor e adicione um fragement de preferências apt para evitar que pacotes que comecem comdotnet
,aspnetcore
ounetstandard
sejam originados do repositório da distribuição.Package: dotnet* aspnet* netstandard* Pin: origin "<your-package-source>" Pin-Priority: -10
Certifique-se de substituir
<your-package-source>
pela fonte do pacote da sua distribuição.Sua distribuição pode ter mais de uma fonte de pacote.
Por exemplo, no Ubuntu nos EUA, você pode precisar usar um fragmento para
archive.ubuntu.com
e outro parasecurity.ubuntu.com
. Separe cada fragmento com uma linha em branco como esta:Package: dotnet* aspnet* netstandard* Pin: origin "archive.ubuntu.com" Pin-Priority: -10 Package: dotnet* aspnet* netstandard* Pin: origin "security.ubuntu.com" Pin-Priority: -10
Gorjeta
Use o
apt-cache policy
comando para localizar a fonte:apt-cache policy '?name(dotnet.*)' | grep -v microsoft | grep '/ubuntu' | cut -d"/" -f3 | sort -u
Gorjeta
Se você registrou o repositório de pacotes de backports do Ubuntu .NET, você deve cancelar o registro do repositório de pacotes de backports do Ubuntu .NET em vez de configurar seu gerenciador de pacotes para ignorar os pacotes .NET contidos. Caso contrário, seu gerenciador de pacotes extrai o índice de pacotes desse repositório, apenas para ignorá-lo, porque o repositório contém apenas pacotes .NET. Isso efetivamente retarda a atualização do índice do pacote local toda vez que você liga
apt update
.Use o
apt-cache policy
comando para verificar se você registrou o repositório de pacotes de backports do Ubuntu .NET:apt-cache policy '?name(dotnet.*)' | grep 'ppa.launchpadcontent.net/dotnet/backports' | sort -u
Reinstale o .NET a partir do feed de pacotes da Microsoft. Para obter mais informações, consulte Instalar o .NET no Linux. Se estiver usando o Ubuntu, consulte Minha distribuição do Ubuntu não inclui a versão .NET que eu quero, ou eu preciso de uma versão .NET fora de suporte.
Referências online
Muitos outros utilizadores relataram esses problemas. Segue-se uma lista dessas questões. Você pode lê-los para obter informações sobre o que pode estar acontecendo:
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 após a atualização para 5.0.3
- SDK #15863: "MSB4018 tarefa ResolveTargetingPackAssets falhou inesperadamente" após a atualização para 5.0.103
- SDK #17411: dotnet compilação sempre lançando erro
- SDK #12075: dotnet 3.1.301 no Fedora 32 não é possível encontrar FrameworkList.xml porque não existe
Erro fatal: libhostfxr.so não foi possível encontrar
Erro fatal: a pasta /host/fxr não existe
Erro fatal: a pasta /host/fxr não contém nenhuma pasta filha numerada por versão
Erros genéricos sem mensagens claras
- Core #4605: não é possível executar "dotnet novo console"
- Core #4644: Não é possível instalar o .NET Core SDK 2.1 no Fedora 32
- Tempo de execução #49375: Depois de atualizar para 5.0.200-1 usando o gerenciador de pacotes, parece que nenhum sdks está instalado
- Instalador #16438: O aplicativo '--version' não existe