Vaihtoehdot

Vaihtoehdot tarjoavat keinot rinnakkaiseen pakettien asentamiseen, jotka tarjoavat saman toiminnallisuuden ylläpitämällä symlinkkijoukkoja (yksi pakettia kohti), jotka osoittavat vaihtoehtoisiin tiedostoihin, kuten tämä: → /polku/alkuperäinen-tiedosto.suffix + Lisätietoja, katso + update-alternatives(8 + `man-sivu.

Käyttö Fedorassa

Vaihtoehtoja VOI käyttää ohjelmiston rinnakkaiseen asentamiseen, kun:

  • ohjelmistoa voidaan käyttää sisään-pudota-korvikkeena ja se toimii riittävän samankaltaisesti, jotta käyttäjien ja muiden ohjelmien ei tarvitsisi järkevässä määrin tietää, mikä variantti on asennettuna

JA

  • ohjelmiston valinnan suorittaa vain järjestelmän laajuisesti järjestelmänvalvoja, eikä loppukäyttäjillä ole tarvetta vaihtaa vaihtoehtojen välillä.

Käänteisesti vaihtoehtoja EI SAA käyttää, kun:

  • Ohjelmisto ei ole sisään-pudota-korviketta. Esimerkiksi jos yleiset komentoriviargumentit eroavat toisistaan näiden kahden variantin välillä, vaihtoehtoja EI SAA käyttää.

TAI

  • Loppukäyttäjät välittävät mitä versiota he käyttävät. Jos muu kuin root-käyttäjä saisi arvon vaihtamalla vaihtoehtojen välillä, vaihtoehtoja EI SAA käyttää.

A good example of using alternatives are the various MTAs which all provide /usr/bin/sendmail with similar command line arguments.

Huonoja esimerkkejä vaihtoehtojen käytöstä ovat:

  • erilaiset MPI-ympäristöt, joissa käyttäjät välittävät sekä siitä, mitä MPI-ympäristöä he kääntävät että mitä vastaan he ajavat

  • muokkaimen valinta, kun käyttäjä vetoaa "vi":hen, jossa käyttäjä huolehtii ominaisuuksien saatavuudesta, yhteensopivuudesta laajennusten kanssa jne

Tapaukset, joissa rinnakkainen asennus on toivottavaa, mutta vaihtoehdot eivät sovi, voivat olla tilanteita, joissa linkki: ../EnvironmentModules/[Ympäristömoduulit] ovat sopivia. MPI ja python-sphinx (Fedora 31:seen saakka) ovat esimerkkipaketteja, jotka käyttävät ympäristömoduuleja tähän tarkoitukseen.

Kuinka käyttää vaihtoehtoja

If a package is using alternatives, the files which would otherwise conflict MUST be installed with an appropriate suffix (for example: %{_bindir}/sendmail.postfix instead of %{_bindir}/sendmail), the original locations MUST be touched (for example: touch %{_bindir}/sendmail), the links set up by alternatives MUST be listed as %ghost in the file list and proper Requires: MUST be added, like in the examples below.

Vaihtoehtoisten tiedostojen lisääminen tiedostoluetteloon varmistaa, että ne ovat vastaavien pakettien omistuksessa, mikä tarkoittaa, että seuraavat komennot:

  • 'rpm -qf /usr/bin/foo'

  • 'dnf install /usr/bin/foo'

  • 'repoquery --whatprovides /usr/bin/foo'

kaikki toimivat kunnolla. %ghostin käyttäminen tähän tarkoitukseen käyttämällä globaaleja ja luotua tiedostoa sallii luettelot.

Esimerkit

Esimerkki antlr.spec:sta:

Requires(post): %{_bindir}/update-alternatives
Requires(postun): %{_bindir}/update-alternatives
...
%install
...
touch %{buildroot}%{_bindir}/antlr

%post
update-alternatives --install %{_bindir}/antlr \
  %{name} %{_bindir}/antlr-java 10

%postun
if [ $1 -eq 0 ] ; then
  update-alternatives --remove %{name} %{_bindir}/antlr-java
fi
...
%files
...
%ghost %{_bindir}/antlr
%{_bindir}/antlr-java

Ja monimutkaisempi esimerkki vaihtoehdoista, jotka on lähetetty sendmail.spec-tiedostosta, hieman muokattu:

Requires(post): %{_bindir}/update-alternatives
Requires(postun): %{_bindir}/update-alternatives
Requires(preun): %{_bindir}/update-alternatives
...
%install
...
# rename files for alternative usage
mv %{buildroot}%{_bindir}/sendmail %{buildroot}%{_bindir}/sendmail.sendmail
touch %{buildroot}%{_bindir}/sendmail
for i in mailq newaliases rmail; do
    mv %{buildroot}%{_bindir}/$i %{buildroot}%{_bindir}/$i.sendmail
    touch %{buildroot}%{_bindir}/$i
done
mv %{buildroot}%{_mandir}/man1/mailq.1 %{buildroot}%{_mandir}/man1/mailq.sendmail.1
touch %{buildroot}%{_mandir}/man1/mailq.1
mv %{buildroot}%{_mandir}/man1/newaliases.1 %{buildroot}%{_mandir}/man1/newaliases.sendmail.1
touch %{buildroot}%{_mandir}/man1/newaliases.1
mv %{buildroot}%{_mandir}/man5/aliases.5 %{buildroot}%{_mandir}/man5/aliases.sendmail.5
touch %{buildroot}%{_mandir}/man5/aliases.5
mv %{buildroot}%{_mandir}/man8/sendmail.8 %{buildroot}%{_mandir}/man8/sendmail.sendmail.8
touch %{buildroot}%{_mandir}/man8/sendmail.8

%postun
if [ "$1" -ge "1" ]; then
    if [ "`+readlink %{_sysconfdir}/alternatives/mta+`" == "%{_bindir}/sendmail.sendmail" ]; then
        %{_bindir}/alternatives --set mta %{_bindir}/sendmail.sendmail
    fi
fi

%post
# Set up the alternatives files for MTAs.
update-alternatives --install %{_bindir}/sendmail mta %{_bindir}/sendmail.sendmail 90 \
    --slave %{_bindir}/mailq mta-mailq %{_bindir}/mailq.sendmail \
    --slave %{_bindir}/newaliases mta-newaliases %{_bindir}/newaliases.sendmail \
    --slave %{_bindir}/rmail mta-rmail %{_bindir}/rmail.sendmail \
    --slave /usr/lib/sendmail mta-sendmail /usr/lib/sendmail.sendmail \
    --slave %{_sysconfdir}/pam.d/smtp mta-pam %{_sysconfdir}/pam.d/smtp.sendmail \
    --slave %{_mandir}/man8/sendmail.8.gz mta-sendmailman %{_mandir}/man8/sendmail.sendmail.8.gz \
    --slave %{_mandir}/man1/mailq.1.gz mta-mailqman %{_mandir}/man1/mailq.sendmail.1.gz \
    --slave %{_mandir}/man1/newaliases.1.gz mta-newaliasesman %{_mandir}/man1/newaliases.sendmail.1.gz \
    --slave %{_mandir}/man5/aliases.5.gz mta-aliasesman %{_mandir}/man5/aliases.sendmail.5.gz \
    --initscript sendmail
...

%preun
if [ $1 = 0 ]; then
    update-alternatives --remove mta %{_bindir}/sendmail.sendmail
fi
...

%files
...
%ghost %{_bindir}/sendmail
%ghost %{_bindir}/mailq
%ghost %{_bindir}/newaliases
%ghost %{_bindir}/rmail
%ghost /usr/lib/sendmail
%ghost %{_sysconfdir}/pam.d/smtp
%ghost %{_mandir}/man8/sendmail.8.gz
%ghost %{_mandir}/man1/mailq.1.gz
%ghost %{_mandir}/man1/newaliases.1.gz
%ghost %{_mandir}/man5/aliases.5.gz

%{_bindir}/sendmail.sendmail
%{_bindir}/mailq.sendmail
%{_bindir}/newaliases.sendmail
%{_bindir}/rmail.sendmail
/usr/lib/sendmail.sendmail
%config(noreplace) %{_sysconfdir}/pam.d/smtp.sendmail
%{_mandir}/man8/sendmail.sendmail.8.gz
%{_mandir}/man1/mailq.sendmail.1.gz
%{_mandir}/man1/newaliases.sendmail.1.gz
%{_mandir}/man5/aliases.sendmail.5.gz

%attr(0755,root,root) %{_initrddir}/sendmail