Symlinkin korvaaminen hakemistolla tai hakemiston korvaaminen minkä tahansa tyyppisellä tiedostolla

RPM:n tunnetusta rajoituksesta johtuen hakemistoa ei voi korvata millään tiedostolla tai symbolilinkillä, eikä hakemistoon osoittavaa symbolinkkiä ole mahdollista korvata hakemistolla ilman, että RPM aiheuttaa tiedostoristiriitavirheitä pakettia asennettaessa. Lisätietoja asiaan liittyvistä ongelmista on osoitteessa bug 447156 ja bugi 646523.

Yritä välttää tätä ongelmaa alunalkaen

Vaikka ei tietenkään ole mahdollista ennakoida kaikkia tapauksia, joissa tarve saattaa ilmaantua, kun tarve on ennakoitavissa, kuten niputettujen kirjastojen kanssa, on parempi käyttää symbolista linkkiä alusta alkaen, koska symlinkin kohdetta voidaan muuttaa helpommin. . Jos sinulla on esimerkiksi niputettu libfoo-kirjasto paketin hakemistorakenteen sisällä, sijoita se esimerkiksi libfoo.bundled-hakemistoon ja tee libfoosta symbolinen linkki siihen. Kun niputtaminen lopulta poistetaan, sinun tarvitsee vain pudottaa hakemisto ja muuttaa symbolinen linkki osoittamaan vastaavaan järjestelmäkirjastohakemistoon turvautumatta alla kuvattuihin komentosarjoihin.

Ongelman kiertäminen komentosarjoilla

Voit kiertää tämän ongelman lisäämällä tiedostoon %pretrans scriptlet, joka suorittaa muunnoksen manuaalisesti ennen kuin RPM yrittää asentaa paketin.

Huomaa, että '%pretrans'-komentosarjat TÄYTYY kirjoittaa Lua:ssa ja siten käyttää -p <lua> toimiakseen järjestelmän alkuasennuksen aikana, jolloin komentotulkkia ei ole vielä asennettu.

Käytä kumpaa tahansa seuraavista kahdesta katkelmasta paketeissa, jotka tarvitsevat tämän siirtymän. Korvaa /path/to/dir muunnettavan hakemiston polulla.

Komentosarja hakemiston korvaamiseksi

RPM ei voi vain poistaa hakemistoa, kun se korvataan tiedostolla tai symbolilinkillä, koska käyttäjät ovat saattaneet lisätä tai muokata tiedostoja hakemistoon. Suojataksesi vahingossa tapahtuvalta tietojen katoamiselta sinun TÄYTYY käyttää seuraavaa komentosarjaa, joka nimeää hakemiston uudelleen jälkiliitteellä .rpmmoved, jotta käyttäjät voivat löytää varmuuskopioidut hakemistot tarvittaessa paketin päivityksen jälkeen. (Se lisää myös kokonaisluvun loppuliitteeseen siinä harvinaisessa tapauksessa, että myös hakemisto on olemassa.)

%pretrans -p <lua>
-- Määritä polku korvattavaan hakemistoon alla.
-- ÄLÄ lisää perään kauttaviivaa.
path = "/path/to/dir"
st = posix.stat(path)
if st and st.type == "directory" then
  status = os.rename(path, path .. ".rpmmoved")
  if not status then
    suffix = 0
    while not status do
      suffix = suffix + 1
      status = os.rename(path .. ".rpmmoved", path .. ".rpmmoved." .. suffix)
    end
    os.rename(path, path .. ".rpmmoved")
  end
end

Lisäksi sinun tulee määrittää hakemisto /path/to/dir.rpmmoved %ghost-merkinnäksi paketin spec-tiedoston %files-luettelossa, jotta hakemisto ei eriydy paketista ja voidaan poistaa, jos paketti joskus poistetaan ja hakemisto on tyhjä.

Komentosarja, joka korvaa symbolisen linkin hakemistoon hakemistolla

Hakemistoon osoittavan symbolisen linkin korvaaminen tavallisella hakemistolla on paljon yksinkertaisempaa, koska ei ole mahdollista poistaa vahingossa ulkoisesti lisättyjä tiedostoja. Seuraava komentosarja tarkistaa symbolin ja poistaa sen. Hakemistoa ei tarvitse luoda tänne, koska RPM tekee sen myöhemmin tapahtuman aikana, kun paketti on asennettu.

%pretrans -p <lua>
-- Määritä polku korvattavaan symbolilinkkiin alla.
path = "/path/to/dir"
st = posix.stat(path)
if st and st.type == "link" then
  os.remove(path)
end