Hallo erst mal.
Ich bin mit einem Kollegen uneins darüber, wie wir mit mehreren Versionen eines Programms umgehen sollen bezüglich Paketierung/Installation. Nehmen wir mal an, die beiden Versionen des Programms "foo" sehen so aus:
Und wir haben ein (eigenentwickeltes) Programm "bar", das die libfoo.so benutzt. Das Programm "bar" wird immer von user "Udo" ausgeführt (er hat es auch entwickelt), das Programm "foo" von user "Ulf". Beide user wollen immer die gleiche Version von "foo" benutzen (also muss auch "bar" immer genau die Version von libfoo.so benutzen, dessen bin/foo "Ulf" benutzt.Code:/opt/foo/1.0/bin/foo /opt/foo/1.0/include/foo.h /opt/foo/1.0/lib/libfoo.so /opt/foo/2.0/bin/foo /opt/foo/2.0/include/foo.h /opt/foo/2.0/lib/libfoo.so
Variante A
Alles wird über's Environment gelöst. User "Ulf" schreibt für jede Version von "foo" eine Environment-Datei, die sich "Ulf" und "Udo" in ihrer ~/.profile sourcen. Diese enthält:
Diese Datei kommt mit ins foo-Paket rein, also bspw. /opt/foo/2.0/env.sh. User "Udo" hatte sein "bar" zwar gebaut als foo 1.0 aktuell war, aber es funktioniert auch mit 2.0. Da der LD_LIBRARY_PATH gesetzt ist, findet "bar" auch die libfoo.so von Version 2.0 ohne dass "bar" neu gelinkt werden muss.Code:export PATH=/opt/foo/2.0/bin:$PATH export LD_LIBRARY_PATH=/opt/foo/2.0/lib
=> Jeder User kontrolliert in seinem Environment, welche Environment-Datei er sourcet und somit auch, welche Version benutzt wird. (Wobei sich Ulf nur um die runtime gekümmert hat und Udo beim Kompilieren/Linken von "bar" im Makefile noch angeben muss, ob er Version 1.0 oder 2.0 nutzt. So lange die Versionen der libfoo.so (binär) kompatibel sind, muss er kein neues "bar" bauen.
Variante B
Alles wird über einen Symlink gelöst. User "Ulf" schreibt eine Environment-Datei, die für alle Versionen von "foo" gleich aussieht:
Das ominöse "current" ist hierbei ein Symlink, der auf "1.0" oder "2.0" zeigt. Der Symlink ist Teil der Installation von "foo", wird also bei jeder Installation einer neuen Version umgebogen auf die zuletzt installierte Version. Außerdem kann "Ulf" den Symlink ändern auf eine ältere Version, wenn er das möchte. Da "Udo" beim Kompilieren sein "bar" gegen /opt/foo/current/lib/libfoo.so gelinkt hat, muss kein LD_LIBRARY_PATH gesetzt werden.Code:export PATH=/opt/foo/current/bin:$PATH
=> Ulf kontrolliert durch die Installation der foo-Pakete bzw. manuelles Anpassen des Symlinks, welche Version von "foo" alle nutzen.
Was meint Ihr dazu? A? B? ...oder ganz anders?
Lesezeichen