En ce moment, je construis et empaquette notre logiciel pour Ubuntu 14.04 aka 'trusty' via dpkg-buildpackage
. Je reçois un package .deb
Qui peut être installé sur Ubuntu 14.04 mais également sur d'autres versions d'Ubuntu, par exemple 12.04 aka "précis". Ceci est dangereux car le logiciel peut être installé sans message d'erreur mais le programme ne peut pas fonctionner/fonctionner correctement.
Les dépendances de mon package sont données dans le fichier control
. Cependant, ce fichier ne me permet pas d'entrer une distribution/nom de code d'Ubuntu. La distribution peut être entrée dans le cadre du *.changes
Mais cela n'est reflété nulle part dans le fichier .deb. La vérification de la situation de dépendance complexe pendant le script de post-installation est également complexe. Ainsi, je veux un moyen simple d'empêcher l'installation d'un paquet Ubuntu sur la mauvaise version d'Ubuntu.
Quelle est la meilleure façon de construire un package qui cible une seule version d'Ubuntu? Dans le meilleur des cas (1) l'installation ne devrait fonctionner que sur la version Ubuntu ciblée et (2) le package .deb
Contient le nom de la distribution *, par ex. comme package_1.0.0-3_trusty_AMD64.deb
.
(*) Sinon, le référentiel apt géré via reprepro
ne peut pas avoir deux packages avec le même numéro de version, chacun ciblant une version d'Ubuntur différente.
Merci d'avance.
Mise à jour:
Le fichier debian/control
De mon package:
Source: mypackage
Priority: extra
Build-Depends: debhelper (>= 9), python (>=2.7), pyside-tools
X-Python-Version: >= 2.7
Standards-Version: 3.9.2
Package: mypackage
Architecture: AMD64
Depends: ros-Indigo-desktop-full|ros-hydro-desktop-full, ros-Indigo-rqt|ros-hydro-rqt, ros-Indigo-gps-umd|ros-hydro-gps-umd, ros-Indigo-map-server|ros-hydro-map-server, imagemagick, octave (>= 3.6), libdc1394-22, sox, tree, python (>=2.7), python-psutil, python-usb, python-serial, python-gi, gir1.2-gexiv2-0.10|gir1.2-gexiv2-0.4, exfat-Fuse|fuse-exfat, exfat-utils, gphotofs, python-pyproj, libusb-1.0-0 (>=2:1.0.17), libpyside1.2|libpyside1.1 (>=1.1.2), ${shlibs:Depends}, ${misc:Depends}
Description: ...
Comme on peut le voir, ce fichier de contrôle a été adapté de telle sorte que nous pouvons exécuter la génération sur plusieurs versions d'Ubuntu où les dépendances ont des numéros de version différents: libpyside1.2|libpyside1.1 (>=1.1.2)
. Y a-t-il une meilleure façon de gérer cela?
Parce que votre package est installé dans la version/l'environnement dans lequel il ne pourra pas fonctionner, cela signifie que vos dépendances control
dépend de quelque chose.
Ce que je m'attends à ce que vous n'ayez pas mis de conditions de version de dépendances, ce qui pourrait permettre d'installer le package sur une seule version si la version de dépendance n'est disponible que dans cette version, par exemple gedit: gedit-common (>= 3.10), gedit-common (<< 3.11)
Depends: libatk1.0-0 (>= 1.12.4), libc6 (>= 2.14), libcairo2 (>= 1.2.4), libenchant1c2a (>= 1.6.0), libgdk-pixbuf2.0-0 (>= 2.22.0), libgirepository-1.0-1 (>= 0.9.3), libglib2.0-0 (>= 2.38), libgtk-3-0 (>= 3.10), libgtksourceview-3.0-1 (>= 3.10.0), libpango-1.0-0 (>= 1.14.0), libpeas-1.0-0 (>= 1.1.0), libx11-6, libxml2 (>= 2.7.4), libzeitgeist-2.0-0 (>= 0.9.9), gedit-common (>= 3.10), gedit-common (<< 3.11), gsettings-desktop-schemas, python3-gi (>= 3.0), python-gi-cairo (>= 3.0), gir1.2-peas-1.0, iso-codes
Recommends: gir1.2-gtksource-3.0, zenity, Yelp
Suggests: gedit-plugins
Breaks: gedit-plugins (<< 2.91)
Référence: Manuel des politiques Debian: Chapitre 7 - Déclarer les relations entre les paquets
Une autre façon d'utiliser le script preinst
et lsb_release
commande:
#!/bin/sh
set -e
release=$(lsb_release -cs)
if [ ! "$release" = "trusty" ]
then
echo "This packages wasn't build for your release."
echo "Package wasn't installed, See ..."
exit 1
fi
exit 0
Si vous voulez que trusty
soit défini lors de la construction, vous pouvez créer un modèle comme preinst.in
et écrire un makefile pour faire une substitution de variable lors de la construction de la source.
Dans un paquet Debian, il n'y a aucun moyen de dire "Autoriser les installations uniquement sur 14.04". Cela doit se produire au niveau du référentiel apt (auquel je reviendrai plus tard). La semi-exception à cela est que parce que Trusty est plus récent que Precise, Trusty aura renommé certains packages de bibliothèque (qui, tant que l'utilisateur n'utilisera pas un PPA qui fournit ces packages, les rendra désinstallables) et auront des versions plus récentes de bibliothèques, pour lesquelles dh-shlibdeps
peut ajouter une exigence de version. Par conséquent, dans ces deux cas, le package sera désinstallable dans Precise. Notez qu'un paquet construit pour Precise pourrait pouvoir être installé dans Trusty.
Comme pour le dépôt apt, les paquets ont un numéro de version Debian distinct pour chaque version. Le format que vous décrivez pourrait fonctionner, bien qu'en utilisant ~
est plus courant, en partie parce que ~
est inférieur à tous les autres caractères, et donc si l'utilisateur passe à une version plus récente (par exemple de Precise à Trusty), et que le package est présent dans les dépôts officiels (avec un numéro de version de 1.0.0-3
, puis l'utilisateur effectuera une mise à niveau à partir de 1.0.0-3~precise1
à 1.0.0-3
, même si vous avez un 1.0.0-3~trusty1
. Cela ne s'applique pas si vous utilisez un autre personnage. J'utilise personnellement quelque chose comme 1.0.0-0ubuntu1~ppa1~precise1
; les ~ppa1
partie est de le rendre moins que n'importe quel paquet Ubuntu officiel qui pourrait venir à l'avenir, et le ~precise1
partie est de spécifier la version. D'autres responsables de PPA peuvent utiliser 1.0.0-3~12.04.1
ou 1.0.0-3~14.04.1
, en spécifiant le numéro de version au lieu du nom de code, qui est garanti d'augmenter (tant que les numéros de version d'Ubuntu ne sont pas réinitialisés).
Notez que les packages binaires ont le même package source, vous devez donc vous assurer que votre .changes
le fichier n'inclut pas le paquet source.