Sharing seputar Dunia Tkj dan Blogging ^^

Showing posts with label dependensi. Show all posts
Showing posts with label dependensi. Show all posts

Tuesday, August 16, 2016

Seri Manajemen Paket Ubuntu 10: Memperoleh Daftar Dependensi via Synaptic Script


Tulisan ini adalah seri ke-10 dari serial sistem manajemen paket Ubuntu kami. Tulisan ini melengkapi seri ke-9 dengan menunjukkan bagaimana mengeluarkan daftar URL dependensi secara GUI dengan Synaptic. Hasil yang diperoleh sama dengan seri ke-9 hanya saja dilakukan dengan cara berbeda. Semoga tulisan ini bermanfaat.


Serial Manajemen Paket Ubuntu

Berikut serial panduan manajemen paket dari kami.


  

    Syarat


    Untuk menerapkan contoh ini ada syarat yang harus dipenuhi pengguna:

    • Ubuntu yang berada di komputer offline harus sudah pernah mengalami Reload (sudo apt-get update) yakni sudah memiliki "peta repositori".  
    • Paket dependensi untuk satu versi Ubuntu tidak bisa diinstal di Ubuntu versi lain. Misalnya paket dependensi di 14.04 hanya bisa diinstal di 14.04 pula, tidak di versi lain. 

    Langkah 1: Memilih Paket


    Buka Synaptic lalu centang paket mana yang mau diinstal lalu pilih Mark for installation. Buka menu File > Generate file download script > pilih tempat penyimpanan (letakkan di $HOME user Anda) > beri nama file > OK. Anggaplah nama file yang Anda tentukan dependensi.txt.


    Langkah 2: Memodifikasi Berkas Script


    Isi dari berkas yang dihasilkan oleh Synaptic sebetulnya berbentuk source code dari bash script. Panduan ini ditujukan untuk diterapkan di semua OS. Maka kita harus memodifikasi sedikit isi script ini supaya isinya murni daftar URL saja. Gunakan perintah berikut.

    awk '{ print $3 }' dependensi.txt | sed '1d' > namafile.txt

    Ganti namafile.txt dengan nama berkas script yang Anda hasilkan. Maka hasilnya script tersebut akan murni berisi daftar URL saja. Contoh hasil yang diinginkan adalah seperti ini:




    Langkah 3: Mengunduh Seluruh Dependensi


    Bawalah berkas daftar URL tadi ke komputer yang tersambung internet. Gunakan browser untuk mengunduh seluruh dependensinya. Mau lebih cepat lagi, gunakan download manager seperti DownThemAll! (pengaya Firefox) untuk mengunduh semua URL sekaligus dalam sekali klik. Simpan semua dependensi (berformat .deb) dalam sebuah folder dan bawalah ke komputer yang offline. Contoh demonstrasi pengunduhannya seperti ini:


    Langkah 4: Menginstal Seluruh Dependensi


    Pindahkan seluruh dependensi yang telah diperoleh ke satu folder di Ubuntu yang offline. Pindahkan dia ke $HOME saja biar mudah. Anggaplah nama folder itu dependensi. Buka Terminal dan laksanakan perintah:

    cd ~/dependensi
    sudo dpkg -i *.deb


    dan tunggu sampai selesai. Maka program ini akan terinstal di Ubuntu yang offline.

    Wednesday, August 10, 2016

    Seri Manajemen Paket 9: Memperoleh Dependensi Secara Offline


    Tulisan ini adalah seri ke-9 dari serial panduan sistem manajemen paket Ubuntu. Tulisan ini memberikan contoh dalam 3 langkah bagaimana pengguna Ubuntu yang komputernya offline bisa menginstal paket-paket software tanpa komputernya tersambung ke internet. Pengunduhan paket-paket software bisa dilakukan di komputer lain dengan sistem operasi apa pun secara instan. Tulisan ini tidak terikat pada repositori Ubuntu sehingga bisa diterapkan pada semua keluarga Debian (Linux Mint, BlankOn, dll.).


    Serial Manajemen Paket Ubuntu

    Berikut serial panduan manajemen paket dari kami.



    Syarat


    Untuk menerapkan contoh ini ada syarat yang harus dipenuhi pengguna:

    • Ubuntu yang berada di komputer offline harus sudah pernah mengalami Reload (sudo apt-get update) yakni sudah memiliki "peta repositori".  
    • Paket dependensi untuk satu versi Ubuntu tidak bisa diinstal di Ubuntu versi lain. Misalnya paket dependensi di 14.04 hanya bisa diinstal di 14.04 pula, tidak di versi lain.

    Langkah 1: Memperoleh URL Seluruh Dependensi

    Dilakukan di: komputer offline.

    Jalankan contoh perintah-perintah di bawah ini di Ubuntu yang sedang offline. Setiap perintah ini menghasilkan sebuah berkas TXT yang isinya adalah baris-baris URL paket-paket dependensi. Sesuaikan saja nama paket yang dicontohkan dengan nama paket yang Anda mau instal. Perintah-perintah ini tidak membutuhkan jaringan internet.


    Contoh 1: URL Dependensi Inkscape
    sudo apt-get install --print-uris --yes inkscape | sed -n "/'/p" | cut --delim="'" --field=2 > dependensi-inkscape.txt


    Contoh 2: URL Dependensi GIMP
    sudo apt-get install --print-uris --yes gimp | sed -n "/'/p" | cut --delim="'" --field=2 > dependensi-gimp.txt


    Contoh 3: URL Dependensi Chromium Browser
    sudo apt-get install --print-uris --yes chromium-browser | sed -n "/'/p" | cut --delim="'" --field=2 > dependensi-chromium-browser.txt


    Contoh Output

    Contoh isi dari berkas TXT dari contoh 3 di atas adalah seperti gambar berikut. Di dalam TXT ini tercantum 3 buah URL untuk 3 paket .deb yang merupakan dependensi untuk menginstal aplikasi Chromium Browser.


    Langkah 2: Mengunduh Seluruh Dependensi


    Dilakukan di: komputer online.

    Bawalah berkas TXT yang sudah berisi URL paket-paket dependensi tadi ke komputer lain yang tersambung ke internet. Sistem operasi pada komputer lain ini bebas, terserah apakah itu Windows, OS X, BSD, GNU/Linux, atau sama-sama Ubuntu.

    Unduh semua URL yang tercantum dalam berkas TXT tadi ke sebuah folder di media penyimpanan Anda. Setelah semua paket .deb dari URL-URL tersebut selesai diunduh, bawa pulang media penyimpanan itu ke komputer offline Anda.

    Untuk mempercepat proses pengunduhan di komputer lain tersebut, gunakan program download manager yang mampu menerima berkas TXT sebagai input. Contohnya dengan Mozilla Firefox gunakan DownThemAll! untuk mengunduh seluruh URL sekaligus. Caranya adalah buka terlebih dahulu TXT itu di jendela baru lalu dengan DownThemAll! pilih dan unduh semuanya. Ini cara instan dan salah satu yang tercepat.


    Ini sangat penting jika berkas TXT Anda memuat ratusan URL. Karena tentu Anda tidak akan suka mengunduh ratusan URL satu per satu.

    Langkah 3: Menginstal Seluruh Dependensi

    Dilakukan di: komputer offline. 

    Salin folder yang sudah berisi paket-paket dependensi tadi ke Ubuntu di komputer offline Anda. Agar Anda mudah, salin ke $HOME Anda.

    Anggaplah nama folder itu dependensi. Buka Terminal dan laksanakan perintah:

    cd ~/dependensi
    sudo dpkg -i *.deb

    Maka perintah ini akan memindahkan konsol Anda dahulu ke direktori dependensi lalu akan memerintahkan dpkg untuk menginstal paket-paket .deb di dalamnya satu per satu sampai selesai. Dengan cara ini Anda telah menginstal sebuah software secara offline di Ubuntu. Perintah ini telah dijelaskan di Seri 3 Mengenal Dpkg.

    Penjelasan

    Perintah panjang untuk memperoleh URL dependensi pada Langkah 1 di atas sejatinya adalah 3 perintah yang disambung jadi satu. Tujuan dari perintah ini adalah mengeluarkan daftar URL dependensi yang lengkap untuk suatu nama paket. Output dari perintah ini adalah sebuah berkas TXT yang berisi baris-baris alamat URL dependensi suatu paket.

    1. Perintah pertama adalah perintah apt-get khusus untuk mencetak URL dependensi ke layar. Opsi yang membuat apt-get bisa mencetak URL dependensi adalah `--print-uris`. Perintah pertama ini adalah yang paling esensial.
    2. Perintah kedua adalah perintah sed khusus untuk mengambil hanya URL-URL dari output perintah pertama. Perintah ini ditambahkan karena output dari perintah pertama mengandung teks-teks yang bukan URL. Namun output dari perintah kedua ini masih menyisakan satu bagian teks yang bukan URL. 
    3. Perintah ketiga adalah perintah cut khusus untuk membuang teks sisa bukan URL dari daftar URL yang telah terbentuk. Output dari perintah ketiga ini adalah hanya benar-benar daftar URL murni yang dicetak ke layar. 
    4. Redireksi (tanda `>`) menyimpan output dari gabungan 3 perintah di atas menjadi sebuah berkas TXT. 

    Catatan Penting


    Apabila pembaca tidak mengetahui nama paket dari program yang hendak diinstal, pembaca dapat mencari nama paket tersebut di http://packages.ubuntu.com. Situs ini adalah layanan resmi Ubuntu yang mampu mencarikan nama-nama paket di dalam seluruh repositori resmi Ubuntu pada seluruh versi Ubuntu. Lihat contoh berikut ini.


    Tuesday, June 14, 2016

    Seri Manajemen Paket Ubuntu 7: Mengenal Apt-Cache


    Dapatkan update terbaru Linuxku.com di kanal Telegram https://telegram.me/linuxkudotcom

    Tutorial ini menjelaskan betapa bergunanya perintah apt-cache selaku bagian dari program APT di Ubuntu. Setelah pada seri ke-3 menjelaskan dpkg dan seri ke-4 menjelaskan apt secara umum, kini saatnya artikel ini lebih spesifik menjelaskan bagaimana database dari APT itu bisa dilihat isinya (di-query) oleh pengguna. Keperluannya bisa sangat luas. Dengan apt-cache, pengguna bisa melihat dependensi dari suatu paket, dependensi-terbalik dari paket yang sama, status repositori yang sedang digunakan, kemungkinan upgrade dan downgrade suatu paket, dan lain-lain. Perintah ini meskipun jarang dikenal pengguna akhir, tetapi menyimpan fitur yang sangat bagus. Tulisan ini membahas apt-cache secara ringkas hanya pada perintah yang diprioritaskan agar mudah untuk pemula. Tulisan ini dilengkapi kamus istilah di bagian akhir. Semoga tulisan ini bermanfaat.


    Serial Manajemen Paket Ubuntu

    Berikut serial panduan manajemen paket dari kami.

    Sekilas Mengingat APT


    APT adalah program yang besar. APT merupakan kumpulan dari program-program yang memiliki satu fungsi masing-masing. Di antara program-program itu adalah apt-cache. Program apt-cache ini (perintah: apt-cache) bertugas melakukan query terhadap cache atau database milik APT. Database yang dimaksud adalah segala berkas di dalam direktori /var/lib/apt/lists/. Anda bisa melihat sendiri bahwa output-output dari apt-cache nanti serupa dengan isi dari database tersebut.

    1. Output Normal


    Perintah: 

    $ apt-cache

    Contoh Output:

    master@master:~$ apt-cache
    apt 1.2.10 (i386)
    Usage: apt-cache [options] command
           apt-cache [options] show pkg1 [pkg2 ...]

    apt-cache queries and displays available information about installed
    and installable packages. It works exclusively on the data acquired
    into the local cache via the 'update' command of e.g. apt-get. The
    displayed information may therefore be outdated if the last update was
    too long ago, but in exchange apt-cache works independently of the
    availability of the configured sources (e.g. offline).

    Most used commands:
      showsrc - Show source records
      search - Search the package list for a regex pattern
      depends - Show raw dependency information for a package
      rdepends - Show reverse dependency information for a package
      show - Show a readable record for the package
      pkgnames - List the names of all packages in the system
      policy - Show policy settings

    See apt-cache(8) for more information about the available commands.
    Configuration options and syntax is detailed in apt.conf(5).
    Information about how to configure sources can be found in sources.list(5).
    Package and version choices can be expressed via apt_preferences(5).
    Security details are available in apt-secure(8).
    master@master:~$


    Penjelasan:

    Jika perintah apt-cache dikerjakan begitu saja tanpa imbuhan argumen, maka output yang Anda lihat seperti di atas. Ingat, output di atas berasal dari versi APT 1.2.10. Output pada versi APT Anda mungkin berbeda tetapi intinya kurang lebih akan sama.

    2. Mencari Paket


    Perintah: 

    $ apt-cache search <kata_kunci>

    Contoh perintah:

    $ apt-cache search pdf reader
    $ apt-cache search office suite
    $ apt-cache search video editor 
    $ apt-cache search audio editor
    $ apt-cache search image editor

    Contoh output:

    master@master:~$ apt-cache search pdf reader
    antiword - Converts MS Word files to text, PS, PDF and XML
    c++-annotations - Extensive tutorial and documentation about C++
    c++-annotations-pdf - Extensive tutorial and documentation about C++ - PDF output
    calibre - e-book converter and library management
    calibre-bin - e-book converter and library management
    ebook-speaker - eBook reader that reads aloud in a synthetic voice
    gimagereader - Graphical GTK+ front-end to tesseract-ocr
    gpdftext - GTK+ text editor for ebook PDF files
    ruby-pdf-inspector - Ruby library for analyzing PDF output
    ruby-pdf-reader - Ruby library for accessing the content of PDF files
    texlive-latex-extra - TeX Live: LaTeX additional packages
    wv - Programs for accessing Microsoft Word documents
    xpdf - Portable Document Format (PDF) reader
    master@master:~$


    Penjelasan:

    Apakah Anda pernah bertanya mengapa Synaptic atau Ubuntu Software Center bisa menayangkan daftar lengkap paket-paket software yang tersedia di repositori, bahkan dalam keadaan offline? Jika ya, jawabannya adalah karena program GUI front-end tersebut membaca database APT yang sudah tersimpan secara offline di dalam /var/lib/apt/lists/. Database ini diperoleh oleh Anda sendiri dengan perintah # apt-get update atau dengan klik tombol Reload. Pertanyaan selanjutnya adalah bagaimana melakukan pencarian yang sama seperti GUI front-end itu tetapi di Terminal? Jawabannya adalah dengan perintah $ apt-cache search.

    Perintah ini akan melakukan hal yang sama ketika Anda mencari kata kunci suatu paket di suatu GUI front-end. Dia akan menampilkan di Terminal Anda daftar nama paket yang mencocoki kata kunci Anda. Nama-nama paket inilah yang Anda akan gunakan untuk # apt-get install nanti atau perintah lainnya.

    Ubuntu 14.04 Trusty Tahr saja telah memiliki sekitar 50.000 paket lebih di dalam repositorinya. Jadi Anda tidak perlu khawatir kekurangan paket software ketika mencari. Coba biasakan mencari dengan perintah ini dan nikmati fasilitasnya.

    3. Mengetahui Status Repositori


    Perintah:

    $ apt-cache policy

    Contoh output:

    master@master:~$ apt-cache policy
    Package files:
     100 /var/lib/dpkg/status
         release a=now

     500 http://archive.ubuntu.com/ubuntu xenial-updates/main i386 Packages release v=16.04,o=Ubuntu,a=xenial-updates,n=xenial,l=Ubuntu,c=main,b=i386
         origin archive.ubuntu.com
     500 http://archive.ubuntu.com/ubuntu xenial/multiverse i386 Packages
         release v=16.04,o=Ubuntu,a=xenial,n=xenial,l=Ubuntu,c=multiverse,b=i386
         origin archive.ubuntu.com
     500 http://archive.ubuntu.com/ubuntu xenial/universe i386 Packages
         release v=16.04,o=Ubuntu,a=xenial,n=xenial,l=Ubuntu,c=universe,b=i386
         origin archive.ubuntu.com
     500 http://archive.ubuntu.com/ubuntu xenial/restricted i386 Packages
         release v=16.04,o=Ubuntu,a=xenial,n=xenial,l=Ubuntu,c=restricted,b=i386
         origin archive.ubuntu.com
     500 http://archive.ubuntu.com/ubuntu xenial/main i386 Packages
         release v=16.04,o=Ubuntu,a=xenial,n=xenial,l=Ubuntu,c=main,b=i386
         origin archive.ubuntu.com
    Pinned packages:
    master@master:~$


    Penjelasan:

    Perhatikan bagian-bagian yang ditebalkan di atas.

    Dengan perintah policy, tanpa imbuhan argumen, kita bisa melihat repositori apa saja yang aktif di dalam Ubuntu kita. Tidak hanya itu, kita juga bisa melihat komponen dan jenis apa saja yang aktif. Di dalam contoh di atas, Ubuntu 16.04 Xenial Xerus saya tampak menggunakan dua jenis repositori yaitu $release: xenial dan repositori $release-updates: xenial-updates. Pada repositori xenial, Ubuntu saya mengaktifkan keempat komponen main restricted universe multiverse bersamaan. Pada repositori xenial-updates, Ubuntu saya mengaktifkan hanya repositori main. Artinya, ketika saya menginstal program dengan apt-get install nanti, apt akan mencari kepada repositori-repositori yang tersebut di atas.

    Ketika Anda mengurangi atau menambah jumlah repositori pada sources.list, setelah Reload, maka hasil dari apt-cache policy ini akan berubah pula. Hal ini dikarenakan apt-cache membaca perubahan dari database APT.


    4. Mengetahui Beda Versi Paket pada Sejumlah Repositori yang Berbeda


    Perintah:

    $ apt-cache policy <nama_paket>

    Contoh perintah: 

    $ apt-cache policy linux-image-generic
    $ apt-cache policy bash
    $ apt-cache policy inkscape

    Contoh output:

    master@master:~$ apt-cache policy linux-image-generic
    linux-image-generic:
      Installed: 4.4.0.21.22
      Candidate: 4.4.0.24.25
      Version table:
         4.4.0.24.25 500
            500 http://archive.ubuntu.com/ubuntu xenial-updates/main i386 Packages
            500 http://security.ubuntu.com/ubuntu xenial-security/main i386 Packages
     *** 4.4.0.21.22 500
            500 http://archive.ubuntu.com/ubuntu xenial/main i386 Packages
            100 /var/lib/dpkg/status
    master@master:~$


    Penjelasan:

    Perhatikan bagian-bagian yang ditebalkan di atas.

    Dengan menambah imbuhan argumen nama paket pada perintah policy, maka kita bisa mengetahui paket tersebut beradanya di repositori mana (saja) dan versi berapa (saja) yang tersedia pada setiap repositori. Kita juga bisa tahu versi terbaru berapa yang bisa diinstal sekarang. Hal ini penting untuk upgrade atau downgrade paket. Penting juga untuk mengetahui versi terbaru yang ada di repositori updates atau security.

    Pada contoh di atas, output dari proses paket linux-image-generic menunjukkan bahwa yang terinstal di dalam Ubuntu saya adalah versi 4.4.0.21 (lihat tanda `***`). Output itu menunjukkan bahwa versi 4.4.0.21 itu diinstal dari repositori xenial dari komponen main.

    Adapun versi terbaru dari paket linux-image-generic berdasarkan output di atas, adalah 4.4.0.24. Versi terbaru ini tersedianya di repositori xenial-updates dan di xenial-security. Ketika saya menjalankan # apt-get install linux-image-generic pada kondisi ini, maka APT akan memberi tahu saya bahwa paket ini bisa di-upgrade ke versi 4.4.0.24. Sekali lagi, apt-cache bisa mengetahui versi-versi ini karena membaca database /var/lib/apt/lists/.

    5. Mengetahui Metadata Paket


    Perintah:

    $ apt-cache show <nama_paket>

    Contoh perintah: 

    $ apt-cache show gimp
    $ apt-cache show nautilus

    $ apt-cache show firefox
    $ apt-cache show wvdial

    Contoh output: 

    master@master:~$ apt-cache show wvdial
    Package: wvdial
    Priority: optional
    Section: comm
    Installed-Size: 263
    Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
    Original-Maintainer: Thierry Randrianiriana <thierry@debian.org>
    Architecture: i386
    Version: 1.61-4.1
    Depends: ppp (>= 2.3.0), debconf (>= 0.5.00) | cdebconf, libc6 (>= 2.4), libstdc++6 (>= 4.1.1), libuniconf4.6, libwvstreams4.6-base, libwvstreams4.6-extras, debconf (>= 0.5) | debconf-2.0
    Filename: pool/main/w/wvdial/wvdial_1.61-4.1_i386.deb
    Size: 76616
    MD5sum: 4bd62b8b5afedb610ce5aac78ac4d522
    SHA1: 0c234445497bd7c7ad9ac67dbac0a07cd6109ffb
    SHA256: cfecc0074759aac409ce636eb0389026dcec81dc27c6b80288300f7f2f115700
    Description-en: intelligent Point-to-Point Protocol dialer
     WvDial sacrifices some of the flexibility of programs like "chat" in order
     to make dialup configuration easier. With WvDial,
     modems are detected automatically and only three additional parameters
     are required: the telephone number, username, and password. WvDial knows
     enough to dial with most modems and log in to most servers without any
     other help.
     .
     In particular, a "chat script" is not required to handle the most common
     situations.
    Description-md5: b8bf30c8dfd4d09e02af74bf497505d6
    Homepage: http://alumnit.ca/wiki/index.php?page=WvDial
    Bugs: https://bugs.launchpad.net/ubuntu/+filebug
    Origin: Ubuntu
    Supported: 5y
    Task: lubuntu-desktop

    master@master:~$


    Penjelasan: 

    Perhatikan bagian-bagian yang ditebalkan di atas.

    Pernahkah Anda bertanya dari mana GUI front-end bisa mengetahui nama paket, total ukuran, total ukuran ketika selesai diinstal, teks deskripsi, dan terpenting daftar dependensi paketnya? Tidak peduli apakah itu Synaptic atau apt-get, bagaimana mereka bisa menayangkannya? Jawabannya adalah dari database APT. Perintah apt-cache show menayangkan metadata itu dengan sempurna.

    Menganalisis output dari sebuah query dari apt-cache bisa panjang sekali. Sebagai contohnya diambil satu kasus. Lihat bagian yang ditebalkan di atas. Lihat pada kolom Depends: yang di sana disebutkan nama-nama paket lain. Itulah daftar dependensi dari paket wvdial.

    Ketika perintah apt-get install membaca metadata dari paket wvdial, dia akan membaca kolom dependensinya. Ketika membaca dependensi-dependensi tersebut, otomatis apt-get akan juga membaca dependensi dari masing-masing dependensi. Terus dilakukan itu sembari membandingkannya dengan database dpkg status (/var/lib/dpkg/status) sampai ujung akhirnya. Lalu daftar dependensinya ditayangkan ke layar. Itu tugas apt-get. Namun jika kita ingin mencari sendiri apa dependensi dari suatu paket, kita cukup menggunakan apt-cache show.

    Keterangan di atas berlaku  juga untuk kolom-kolom lain. Misalnya kenapa apt-get bisa mengetahui persis alamat unduhan setiap paket .deb di setiap proses instalasi? Jawabannya adalah kolom Filename: di atas. apt-get akan menggabungkan nilai metadata itu dengan alamat yang Anda setel di dalam sources.list. Jadilah nanti URL lengkap. Semua perbuatan apt-get yang sangat panjang ini terjadi dalam orde milidetik sehingga kita tidak menyadarinya.

    Kamus Istilah


    • Repositori: sumber pengambilan paket. Bentuk fisiknya biasanya sebuah server di internet. Di keluarga Debian, sumber-sumber itu (alamat-alamat URL itu) disetel di dalam berkas /etc/apt/sources.list. Baca kembali artikel perkenalan repositori.
    • Metadata: data yang memuat informasi tentang data lain. Di dalam konteks kita, metadata yang dimaksud adalah informasi yang terdapat di dalam database APT mengenai suatu paket. Informasi ini diambil dari berkas bernama control yang pasti ada di setiap paket.
    • Argumen: teks yang dituliskan setelah nama perintah. Contohnya perintah mkdir rumahku berarti rmdir perintahnya sedangkan rumahku argumennya.
    • Dependensi: dependency, ketergantungan; dalam konteks manajemen paket artinya kondisi ketika sebuah paket dibutuhkan oleh paket lain, tanpa paket itu maka paket lain itu tidak bisa diinstal. 
    • Dependensi-terbalik: reverse-dependency, ketergantungan terbalik; dalam konteks manajemen paket artinya daftar paket yang membutuhkan paket yang bersangkutan, tanpa paket yang bersangkutan paket yang dependensi-terbaliknya mengarah kepadanya tidak bisa diinstal.