Memecahkan masalah kesalahan .NET yang terkait dengan file yang hilang di Linux
Ketika Anda mencoba menggunakan .NET di Linux, perintah seperti dotnet new
dan dotnet run
mungkin gagal dengan pesan yang terkait dengan file yang tidak ditemukan, seperti fxr, libhostfxr.so, atau FrameworkList.xml. Beberapa pesan kesalahan mungkin mirip dengan item berikut:
System.IO.FileNotFoundException
System.IO.FileNotFoundException: Tidak dapat menemukan file '/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/5.0.0/data/FrameworkList.xml'.
Terjadi kesalahan fatal.
Terjadi kesalahan fatal. Pustaka libhostfxr.so yang diperlukan tidak dapat ditemukan.
or
Terjadi kesalahan fatal. Folder [/usr/share//dotnethost/fxr] tidak ada.
or
Terjadi kesalahan fatal, folder [//usrshare//dotnethost/fxr] tidak berisi folder turunan bernomor versi apa pun.
Pesan generik tentang dotnet tidak ditemukan
Pesan umum mungkin muncul yang menunjukkan SDK tidak ditemukan, atau bahwa paket telah diinstal.
Salah satu gejala dari masalah ini adalah folder /usr/lib64/dotnet
dan /usr/share/dotnet
berada di sistem Anda.
Tip
dotnet --info
Gunakan perintah untuk mencantumkan SDK dan Runtime mana yang diinstal. Untuk informasi lebih lanjut, lihat Cara memeriksa apakah .NET sudah diinstal.
Apa yang terjadi
Penting
Dimulai dengan .NET 9, Microsoft hanya menerbitkan paket untuk distribusi Linux yang didukung yang tidak menerbitkan paket mereka sendiri. Untuk informasi selengkapnya, lihat Menginstal .NET di Linux.
Kesalahan ini biasanya terjadi ketika dua repositori paket Linux menyediakan paket .NET. Meskipun Microsoft menyediakan repositori paket Linux untuk sumber paket .NET, beberapa distribusi Linux juga menyediakan paket .NET. Distribusi ini meliputi:
- Alpine Linux
- Arch
- CentOS Stream
- Fedora
- RHEL
- Ubuntu 22.04+
Jika Anda mencampur paket .NET dari dua sumber yang berbeda, Anda mungkin akan mengalami masalah. Paket mungkin menempatkan hal-hal di jalur yang berbeda dan mungkin dikompilasi secara berbeda.
Solusi
Solusi untuk masalah ini adalah menggunakan .NET dari satu repositori paket. Repositori mana yang harus dipilih, dan cara melakukannya, bervariasi menurut kasus penggunaan dan distribusi Linux.
- Distribusi Linux saya menyediakan paket .NET, dan saya ingin menggunakannya.
- Saya memerlukan versi .NET yang tidak disediakan oleh distribusi Linux saya.
Distribusi Linux saya menyediakan paket .NET, dan saya ingin menggunakannya
Apakah Anda menggunakan repositori Microsoft untuk paket lain, seperti PowerShell dan MSSQL?
Ya
Konfigurasikan manajer paket Anda untuk mengabaikan paket .NET dari repositori Microsoft. Ada kemungkinan Bahwa Anda telah menginstal .NET dari kedua repositori, jadi Anda ingin memilih satu atau yang lain.
Hapus paket .NET yang ada dari distribusi Anda. Anda ingin memulai kembali dan memastikan bahwa Anda tidak menginstalnya dari repositori yang salah.
sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
Konfigurasikan repositori Microsoft untuk mengabaikan paket .NET.
echo 'excludepkgs=dotnet*,aspnet*,netstandard*' | sudo tee -a /etc/yum.repos.d/microsoft-prod.repo
Instal ulang .NET dari umpan paket distribusi. Untuk informasi selengkapnya, lihat Menginstal .NET di Linux.
Tidak
Hapus paket .NET yang ada dari distribusi Anda. Anda ingin memulai kembali dan memastikan bahwa Anda tidak menginstalnya dari repositori yang salah.
sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
Hapus umpan repositori Microsoft dari distribusi Anda.
sudo dnf remove packages-microsoft-prod
Instal ulang .NET dari umpan paket distribusi. Untuk informasi selengkapnya, lihat Menginstal .NET di Linux.
Apakah Anda menggunakan repositori Microsoft untuk paket lain, seperti PowerShell dan MSSQL?
Ya
Konfigurasikan manajer paket Anda untuk mengabaikan paket .NET dari repositori Microsoft. Ada kemungkinan Bahwa Anda telah menginstal .NET dari kedua repositori, jadi Anda ingin memilih satu atau yang lain.
Hapus paket .NET yang ada dari distribusi Anda. Anda ingin memulai kembali dan memastikan bahwa Anda tidak menginstalnya dari repositori yang salah.
sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
Buat
/etc/apt/preferences
, jika belum ada.touch /etc/apt/preferences
Buka
/etc/apt/preferences
di editor dan tambahkan pengaturan berikut, yang mencegah paket yang dimulai dengandotnet
, ,aspnetcore
ataunetstandard
bersumber dari repositori Microsoft:Package: dotnet* aspnet* netstandard* Pin: origin "packages.microsoft.com" Pin-Priority: -10
Instal ulang .NET dari umpan paket distribusi. Untuk informasi selengkapnya, lihat Menginstal .NET di Linux.
Tidak
Hapus paket .NET yang ada dari distribusi Anda. Anda ingin memulai kembali dan memastikan bahwa Anda tidak menginstalnya dari repositori yang salah.
sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
Hapus umpan repositori Microsoft dari distribusi Anda.
sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list sudo apt update
Instal ulang .NET dari umpan paket distribusi. Untuk informasi selengkapnya, lihat Menginstal .NET di Linux.
Saya memerlukan versi .NET yang tidak disediakan oleh distribusi Linux saya
Konfigurasikan manajer paket Anda untuk mengabaikan paket .NET dari repositori distribusi. Ada kemungkinan Bahwa Anda telah menginstal .NET dari kedua repositori, jadi Anda ingin memilih satu atau yang lain.
Hapus paket .NET yang ada dari distribusi Anda. Anda ingin memulai kembali dan memastikan bahwa Anda tidak menginstalnya dari repositori yang salah.
sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
Konfigurasikan repositori Linux untuk mengabaikan paket .NET.
echo 'excludepkgs=dotnet*,aspnet*,netstandard*' | sudo tee -a /etc/yum.repos.d/<your-package-source>.repo
Pastikan untuk mengganti
<your-package-source>
dengan sumber paket distribusi Anda.Instal ulang .NET dari umpan paket distribusi. Untuk informasi selengkapnya, lihat Menginstal .NET di Linux.
Konfigurasikan manajer paket Anda untuk mengabaikan paket .NET dari repositori distribusi. Ada kemungkinan Bahwa Anda telah menginstal .NET dari kedua repositori, jadi Anda ingin memilih satu atau yang lain.
Hapus paket .NET yang ada dari distribusi Anda. Anda ingin memulai kembali dan memastikan bahwa Anda tidak menginstalnya dari repositori yang salah.
sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
Buat
/etc/apt/preferences
, jika belum ada.touch /etc/apt/preferences
Buka
/etc/apt/preferences
di editor dan tambahkan fragmen preferensi apt untuk mencegah paket yang dimulai dengandotnet
, ,aspnetcore
ataunetstandard
bersumber dari repositori distribusi.Package: dotnet* aspnet* netstandard* Pin: origin "<your-package-source>" Pin-Priority: -10
Pastikan untuk mengganti
<your-package-source>
dengan sumber paket distribusi Anda.Distribusi Anda mungkin memiliki lebih dari satu sumber paket.
Misalnya, pada Ubuntu di AS, Anda mungkin perlu menggunakan satu fragmen untuk
archive.ubuntu.com
dan yang lain untuksecurity.ubuntu.com
. Pisahkan setiap fragmen dengan baris kosong seperti ini:Package: dotnet* aspnet* netstandard* Pin: origin "archive.ubuntu.com" Pin-Priority: -10 Package: dotnet* aspnet* netstandard* Pin: origin "security.ubuntu.com" Pin-Priority: -10
Tip
apt-cache policy
Gunakan perintah untuk menemukan sumber:apt-cache policy '?name(dotnet.*)' | grep -v microsoft | grep '/ubuntu' | cut -d"/" -f3 | sort -u
Tip
Jika Anda mendaftarkan repositori paket backport Ubuntu .NET, Anda harus membatalkan pendaftaran repositori paket backport Ubuntu .NET alih-alih mengonfigurasi manajer paket Anda untuk mengabaikan paket .NET yang terkandung. Jika tidak, manajer paket Anda menarik indeks paket dari repositori ini, hanya untuk mengabaikannya, karena repositori hanya berisi paket .NET. Ini secara efektif memperlambat pembaruan indeks paket lokal Anda setiap kali Anda memanggil
apt update
.apt-cache policy
Gunakan perintah untuk memeriksa apakah Anda mendaftarkan repositori paket backport ubuntu .NET:apt-cache policy '?name(dotnet.*)' | grep 'ppa.launchpadcontent.net/dotnet/backports' | sort -u
Instal ulang .NET dari umpan paket Microsoft. Untuk informasi selengkapnya, lihat Menginstal .NET di Linux. Jika menggunakan Ubuntu, lihat Distribusi Ubuntu saya tidak menyertakan versi .NET yang saya inginkan, atau saya memerlukan versi .NET yang tidak didukung.
Referensi online
Banyak pengguna lain telah melaporkan masalah ini. Berikut ini adalah daftar masalah tersebut. Anda dapat membacanya untuk wawasan tentang apa yang mungkin terjadi:
System.IO.FileNotFoundExceptiondan '//usrshare//dotnetpacks/Microsoft.NETCore.App.Ref/5.0.0/data/FrameworkList.xml'
- SDK #15785: tidak dapat membangun proyek baru setelah meningkatkan ke 5.0.3
- SDK #15863: "MSB4018 tugas ResolveTargetingPackAssets gagal secara tak terduga" setelah memperbarui ke 5.0.103
- SDK #17411: dotnet build selalu melempar kesalahan
- SDK #12075: dotnet 3.1.301 di Fedora 32 tidak dapat ditemukan FrameworkList.xml karena tidak ada
Kesalahan fatal: libhostfxr.so tidak dapat ditemukan
Kesalahan fatal: folder /host/fxr tidak ada
Kesalahan fatal: folder /host/fxr tidak berisi folder turunan bernomor versi apa pun
Kesalahan umum tanpa pesan yang jelas