Veraltete Paketbaurichtlinien für Golang

Diese Richtlinien wurden durch eine neuere Version ersetzt.

Sie dienen als historische Referenz für Pakete, die den neuen Richtlinien noch nicht entsprechen.

Dieses Dokument beschreibt bewährte Verfahren zum Erstellen von Golang-Paketen. Der Großteil davon ist durch die umfassende Verwendung von Makros automatisiert.

go2rpm

go2rpm ist ein Werkzeug, das viele dieser Schritte automatisiert. Es empfiehlt sich, zunächst go2rpm import_path auszuprobieren, bevor man versucht, eine .spec-Datei manuell zu schreiben.

Importpfad

In Golang werden Pakete über vollständige URLs referenziert. Da diese URL an mehreren Stellen in der Spec-Datei verwendet wird, sollte der Basisimportpfad als globale Definition am Anfang der Spec-Datei festgelegt werden.

%global goipath     github.com/kr/pretty

Alle Makros, einschließlich Paketname und Quell-URL, werden aus diesem Wert berechnet.

Nehmen Sie sich die Zeit, es genau zu identifizieren. Eine spätere Änderung wird unpraktisch sein.

  • es kann von der Repository-URL abweichen;

  • im Allgemeinen ist der korrekte Wert derjenige, der im Projekt in der Dokumentation, in Codebeispielen und in Build-Assertions verwendet wird;

  • wenn ein Projekt gopkg verwendet, sollte der Importpfad für alle Codezustände verwendet werden.

Falls es nach mehreren Forks und Umbenennungen zu Verwirrungen im Upstream-Projekt gekommen ist, müssen Sie die Verweise auf die alten Namen in den Go-Quelldateien, einschließlich der Unit-Tests, korrigieren. Führen Sie diese Korrektur in %prep durch.

Benennung

Quellpakete (src.rpm)

  • Golang-Quellcodepakete, die Code bereitstellen, MÜSSEN nach ihrem Hauptimportpfad benannt werden. Dieser Prozess wird durch das Makro %{goname} automatisiert. Dieses Makro entfernt Großbuchstaben, das Schlüsselwort „go“ und jegliche Duplikate im Importpfad.

    Beispielsweise:

    • der Importpfad github.com/kr/pretty wird zu golang-github-kr-pretty

    • der Importpfad github.com/DATA-DOG/go-txdb wird zu golang-github-data-dog-txdb

    • der Importpfad github.com/gopherjs/gopherjs wird zu golang-github-gopherjs

    Der Dateiname der Spec-Datei MUSS mit dem Namen des Pakets übereinstimmen.

    Wenn Sie nicht sicher sind, welcher Name vom Makro %{goname} verarbeitet wird, erstellen Sie einfach das SRPM mit:

    fedpkg --release f31 srpm

    Der SRPM-Dateiname muss in Ihrer rpmspec- und spec-Datei verwendet werden.

  • Quellpakete, die eine bekannte Anwendung wie beispielsweise etcd bereitstellen, MÜSSEN nach der Anwendung benannt werden. Endbenutzer interessiert die Programmiersprache ihrer Anwendungen nicht. Benennen Sie Pakete jedoch nicht nach einer obskuren Hilfsprogrammdatei, die zufällig vom Paket erstellt wird.

Implementierung: %{gorpmname}

%gometa verwendet das Makro %{gorpmname}, um den Haupt-%{goname} aus %{goipath} zu ermitteln.

%{gorpmname} kann Konflikte verursachen

%{gorpmname} versucht, aus Go-Importpfaden benutzerfreundliche und rpm-kompatible Namenskonventionen zu generieren. Diese werden vereinfacht, indem Redundanzen und häufig verwendete Qualifizierer entfernt werden. Daher kann es vorkommen, dass zwei verschiedene Importpfade dasselbe Ergebnis liefern. In diesem Fall können Sie das Ergebnis manuell anpassen, um Namenskonflikte zu vermeiden.

Go-Code-Pakete: %{goname}-devel

In einem Quellcodepaket, das Go-Code bereitstellt

Pakete, die Go-Code in %{goipath} ausliefern, sollten den Namen %{goname}-devel tragen. Falls Ihr Quellpaket bereits den Namen %{goname} trägt, dann gilt Folgendes:

%package devel
[…]
%description devel
[…]
%files devel -f devel.file-list

Dies wurde durch die im Abschnitt [Paketmetadaten] unten beschriebenen Makros %{gopkg} und %{gopdevelkg} automatisiert.

In einer anderen Art von Quellpaket

Wenn Ihr Quellpaket einen anderen Namen als %{goname} hat, SOLLTEN Sie Folgendes verwenden:

%package -n %{goname}-devel
[…]
%description -n %{goname}-devel
[…]
%files -n %{goname}-devel -f devel.file-list

Separate Code-Pakete

Und schließlich, falls Sie den Go-Code des Projekts in mehrere Pakete aufteilen möchten, können Sie die entsprechenden Namen wie folgt ermitteln:

%global goname1 %gorpmname importpath1
[…]
%package -n %{goname1}-devel
[…]
%description -n %{goname1}-devel
[…]
%files -n %{goname1}-devel -f %{goname1}.file-list

Siehe auch das Kapitel Umgang mit zirkulären Abhängigkeiten.

Denken Sie daran, dass in Go jedes Verzeichnis ein Paket darstellt. Trennen Sie niemals die .go-Dateien, die sich in einem einzigen Verzeichnis befinden, in verschiedene Pakete auf.

Kompatibilitätspakete für Importpfade: %{compat-%{oldgoname}-devel}

Wenn ein Projekt aufgrund von Forks, Umbenennungen, Rehostings, organisatorischen Änderungen oder verwirrender Projektdokumentation unter mehreren Importpfaden referenziert werden kann, ist es möglich, Kompatibilitäts-Teilpakete zu generieren, um Code, der einen der anderen Importpfade verwendet, mit dem kanonischen Pfad zu verbinden.

Der kanonische Importpfad SOLLTE immer derjenige sein, der in der Projektdokumentation angegeben ist. Einige Projekte dokumentieren jedoch keine Änderungen des Importpfads und verwenden HTTPS-Weiterleitungen (z.B. https://github.com/docker/dockerhttps://github.com/moby/moby). Eine solche Weiterleitung ist ein ausreichender Hinweis darauf, dass sich der kanonische Importpfad geändert hat (bitte überprüfen Sie dies aber mit dem Upstream-Projekt).

Der neue Importpfad SOLLTE in %{goipath} widergespiegelt werden und Kompatibilitätsimportpfade MÜSSEN mit dem Makro goaltipaths deklariert werden:

# Eine durch Leerzeichen getrennte Liste von Importpfaden zur Simulation.
%global goaltipaths

Beispielsweise wurde die Go-Bibliothek github.com/Sirupsen/logrus in github.com/sirupsen/logrus umbenannt, und die Dokumentation spiegelt diesen neuen Importpfad wider. Der Paketierer SOLLTE daher eine Umbenennung seines Pakets mit einem neuen Importpfad und einem Kompatibilitätsimportpfad anfordern:

%global goipath     github.com/sirupsen/logrus
%global goaltipaths github.com/Sirupsen/logrus

Wenn ein Projekt mehrfach umbenannt wurde, können auch mehrere Kompatibilitätsimportpfade angegeben werden.

Umbenennungen dürfen niemals aufgeschoben werden

Paketierer DÜRFEN KEINE Teilpakete zur Kompatibilität von Importpfaden verwenden, um den kanonischen Importpfad auf einen der vorherigen Namen umzubenennen. Paketierer MÜSSEN die vom Upstream-Projekt vorgenommenen Umbenennungen auf die Haupt-Spec-Datei-Variable %{goipath} und alle davon abgeleiteten Variablen, wie z. B. %{goname}, anwenden. Verzögerte Umbenennungen führen zu Konflikten mit dem Upstream-Projekt und anderen Paketbetreuern.

Go-Binärpakete

Die von Ihrer Spec-Datei erzeugten Binärdateien SOLLTEN im Allgemeinen im Hauptpaket aufgeführt werden. Falls Sie jedoch einen passenderen Namen wünschen oder die Binärdateien auf verschiedene Pakete verteilen möchten, können Sie zusätzliche Binär-Teilpakete erstellen. Diese Teilpakete DÜRFEN natürlich NICHT architekturunabhängig („noarch“) sein.

Wir können beispielsweise das Paket bbolt erstellen, das die gleichnamige Binärdatei enthält:

%package -n bbolt
[…]
%description -n bbolt
[…]
%files -n bbolt
%license LICENSE
%{_bindir}/bbolt

Versionierung

Viele Go-Bibliotheken verwenden keine Paketversionen oder regelmäßige Releases, sondern werden über eine öffentliche Versionskontrolle verwaltet. In diesem Fall gelten die Standard-Versionskonventionen von Fedora. Das bedeutet, dass Go-Pakete häufig eine Versionsnummer von 0 und eine Release-Nummer wie 0.10.20190319git27435c6 haben.

Der Großteil dieses Prozesses wird durch Makros automatisiert, so dass Sie die Versionsnummer nicht selbst angeben müssen.

Zuerst geben Sie im Header entweder eine Version, ein Tag oder einen Commit an.

Version:
%global tag
%global commit

Verwenden Sie dann das Makro %gometa:

%gometa

Das Makro %gometa verarbeitet automatisch das %{?dist}-Tag des Feldes Release, um gegebenenfalls den Commit zu berücksichtigen.

Commits im Vergleich zu Releases

Sie SOLLTEN Releases priorisieren. Bitte honorieren Sie Projekte, die sich um die Identifizierung stabiler Codezustände bemühen. Greifen Sie nur dann auf Commits zurück, wenn das Projekt keine Releases veröffentlicht, das Release älter als sechs Monate ist oder Sie unbedingt eine Änderung eines späteren Commits benötigen. In den letztgenannten Fällen informieren Sie das Projekt bitte höflich über den Grund, warum Sie auf die offiziellen Releases verzichten mussten. Die Priorisierung von Releases hilft, Probleme mit inkompatiblen Commits zu vermeiden.

Architekturen für Golang

Für die Kompilierung auf verschiedenen Architekturen stehen die Compiler golang und gcc-go zur Verfügung. Der golang-Compiler unterstützt derzeit x86, x86_64, ppc64le, ppc64 (teilweise, siehe Upstream-Ticket #13192), s390x, armv7hl und aarch64.

Binärdateien SOLLTEN ExclusiveArch setzen, damit Pakete nur auf den angegebenen Architekturen erstellt werden. Dies wird nun automatisch durch das Makro %gometa mithilfe des Makros %{golang_arches} hinzugefügt. Paketierer können %ix86 ausschließen (siehe Changes/EncourageI686LeafRemoval), indem sie -f an das Makro %gometa übergeben. Das Flag -f weist %gometa an, ExclusiveArch: %{golang_arches_future} anstelle von ExclusiveArch: %{golang_arches} zu setzen. %{golang_arches_future} umfasst dieselben Architekturen wie {golang_arches}, jedoch ohne %ix86.

Abhängigkeiten

Pakete MÜSSEN BuildRequires: go-rpm-macros haben.

Dies wird durch das Makro %gometa automatisiert.

Automatische Generierung von Abhängigkeiten

Die meisten golang-*-Pakete enthalten nur Quellcode. Das *-devel-Teilpaket, das den Quellcode enthält, sollte explizit die benötigten Go-Importe bereitstellen. Diese Bereitstellungen werden automatisch aus den Importpfaden abgeleitet.

Binärdateien, die diese Importe enthalten, verwenden sie beispielsweise in BuildRequires:

BuildRequires: golang(github.com/gorilla/context)

Gebündelt oder nicht gebündelt

Aktuell SOLLTEN Go-Projekte, die in Fedora paketiert sind, standardmäßig „entbündelt“ werden. Das bedeutet, dass die Projekte aus den in Fedora enthaltenen Abhängigkeiten erstellt werden.

Für manche Projekte kann es sinnvoll sein, aus mitgelieferten Abhängigkeiten zu kompilieren. Jede solche Bündelung bedarf einer triftigen Begründung.

BuildRequires

Die BuildRequires des Projekts enthalten die Abhängigkeiten, die von Unit-Tests und Binärdateien benötigt werden.

Sie können sie manuell mit golist sammeln. Zum Beispiel:

 export GOPATH=/home/user/go
 export GO111MODULE=off
 export goipath="github.com/sirupsen/logrus"
 go get $goipath
 (sort -u | xargs -I{} echo "BuildRequires:  golang({})") <<< "$(
  golist --imported --package-path $goipath --skip-self
  golist --imported --package-path $goipath --skip-self --tests
 )"

gibt Folgendes aus:

BuildRequires:  golang(github.com/stretchr/testify/assert)
BuildRequires:  golang(github.com/stretchr/testify/require)
BuildRequires:  golang(golang.org/x/crypto/ssh/terminal)

Wenn automatische BuildRequires für Ihr Bauziel verfügbar sind, können Sie das Makro %go_generate_buildrequires in %generate_buildrequires verwenden:

%generate_buildrequires
%go_generate_buildrequires

Dieses Makro nutzt golist, um Bau- und Testabhängigkeiten aus dem Paketquellcode zu sammeln.

Testen

Sie MÜSSEN Unit-Tests durchführen. Aufgrund der Natur der Go-Entwicklung, insbesondere des Fehlens semantischer Versionierung, treten API-Fehler häufig auf. Diese müssen frühzeitig erkannt und an die Upstream-Entwickler weitergeleitet werden.

Einige Tests können deaktiviert werden, insbesondere die folgenden Arten von Unit-Tests sind zu einer sicheren Bauumgebung wie Mock nicht kompatibel:

  • Tests, die einen Remote-Server oder eine API über das Internet aufrufen,

  • Tests, die versuchen, das System zu rekonfigurieren,

  • Tests, die auf eine bestimmte Anwendung angewiesen sind, die auf dem System ausgeführt wird, wie z.B. ein Datenbank- oder Systemprotokoll-Server.

Wenn ein Test aus einem anderen Grund fehlschlägt, können Sie ihn auf dieselbe Weise deaktivieren. Sie SOLLTEN das Problem jedoch auch dem Upstream-Projekt melden. Vergessen Sie nicht, in einem Kommentar nachzuvollziehen, warum jeder einzelne Test deaktiviert wurde, und gegebenenfalls Links zu den Upstream-Fehlerberichten hinzuzufügen.

Durchlauf

In diesem Kapitel wird eine typische Go-Spec-Datei Schritt für Schritt mit Kommentaren und Erläuterungen vorgestellt.

Spec-Datei-Vorspann: %{goipath}, %{forgeurl} und %gometa

Üblicher Fall

Ein Go-Paket wird über seinen Importpfad identifiziert. Eine Go-Spec-Datei beginnt daher mit der Deklaration %{goipath}. Verwechseln Sie das nicht, denn diese Deklaration steuert das Verhalten des restlichen Inhalts der Spec-Datei.

%global goipath    google.golang.org/api

Wenn Ihr Paket auf einer Forge wie GitHub, GitLab, Bitbucket oder Pager gehostet wird, wird der Hosting-Standort des Go-Pakets automatisch aus dieser Variable abgeleitet (üblicherweise durch Voranstellen von \https://). Anderenfalls müssen Sie die Hosting-URL explizit mit dem Makro %{forgeurl} angeben.

%global forgeurl    https://github.com/google/google-api-go-client

Auf die Deklaration %{forgeurl} folgt entweder Version, commit oder tag. Verwenden Sie die Kombination, die Ihrem Anwendungsfall entspricht.

%global commit     2dc3ad4d67ba9a37200c5702d36687a940df1111

Sie können auch date definieren, um den Änderungszeitpunkt des Quellarchivs zu überschreiben.

Nachdem wir nun alle erforderlichen Variablen haben, kann das Makro %gometa ausgeführt werden.

%gometa

Es ermittelt und setzt die folgenden Variablen, falls diese nicht bereits vom Paketierer festgelegt wurden:

goname

einen rpm-kompatiblen Paketnamen, abgeleitet von goipath

gosource

eine URL, die als Wert für SourceX: verwendet werden kann

gourl

eine URL, die als Wert für URL: verwendet werden kann

Die Verarbeitung wird an das Makro %forgemeta delegiert für:

forgesource

eine URL, die als Wert für SourceX: verwendet werden kann

forgesetupargs

die korrekten Argumente, die an %setup für diese Quelle übergeben werden müssen, die von %forgesetup und %forgeautosetup verwendet wird

archivename

der Dateiname des Quelarchivs ohne Endungen

archiveext

die Dateinamensendungen des Quellarchivs, ohne führenden Punkt

archiveurl

die URL, die zum Herunterladen des Quellarchivs verwendet werden kann, ohne Umbenennung

topdir

das oberste Verzeichnis des Quellarchivs (kann leer sein)

extractdir

das Quellverzeichnis, das innerhalb von %{_builddir} nach Aufruf von %forgesetup, %forgeautosetup oder %{forgesetupargs} erstellt wurde

repo

der Name des Repositorys

owner

der Repository-Inhaber (falls von einer anderen berechneten Variable verwendet)

shortcommit

die vom Forge verwendete Commit-Hash-Begrenzung, falls vorhanden

scm

Der SCM-Typ beim Paketieren von Code-Snapshots: Commits oder Tags

distprefix

das Präfix, das zu dist hinzugefügt werden muss, um Nicht-Release-Pakete zu verfolgen

Die meisten berechneten Variablen sind sowohl überschreibbar als auch optional.

Nun können wir die restlichen Elemente des Vorspanns hinzufügen. Zunächst können wir einen mehrzeiligen Beschreibungsblock definieren, der von allen Teilpaketen gemeinsam genutzt wird:

%global common_description %{expand:
cmux is a generic Go library to multiplex connections based on their payload.
Using cmux, you can serve gRPC, SSH, HTTPS, HTTP, Go RPC, and pretty much any
other protocol on the same TCP listener.}

Diese Beschreibung DARF maximal 80 Zeichen pro Zeile umfassen.

Falls Sie eine detaillierte Summary oder Description für Entwicklungspakete benötigen, können Sie diese auch definieren:

  • %global godevelsummary

  • %global godeveldescription

Dann MÜSSEN wir die Lizenzdateien angeben, die zu den Entwicklungs-Teilpaketen hinzugefügt werden sollen:

%global golicenses: Eine durch Leerzeichen getrennte Liste von Shell-Globs, die den Projektlizenzdateien enstprechen.

Und die mögliche Dokumentation, die beigefügt werden SOLLTE:

%global godocs: Eine durch Leerzeichen getrennte Liste von Shell-Glob-Mustern, die den Projektdokumentationsdateien entsprechen. Die Go-RPM-Makros erkennen standardmäßig auch ohne diese Angabe Dateien mit der Endung „.md“.

Sie können Dateien auch von %golicense und %godocs ausschließen mit:

  • %global golicensesex

  • %global godocsex

Beispielsweise möchten Sie möglicherweise die INSTALL*-Dateien von %godocs ausschließen, da diese nicht bereitgestellt werden sollen.

Quellpaket-Metadaten: %{goname}, %{gourl} und %{gosource}

Wir können die üblichen RPM-Header deklarieren, indem wir die von %gometa ermittelten Werte verwenden:

Name:      %{goname}
# If not set before
Version:
Release:   1%{?dist}
Summary:
License:
URL:       %{gourl}
Source:    %{gosource}

Sie können diese durch manuelle Definitionen ersetzen. Ersetzen Sie beispielsweise %{gourl} durch die Projekt-Homepage, falls diese separat von der Repository-URL existiert. Achten Sie darauf, %{go*}-Variablen nur dann zu ersetzen, wenn dies einen Mehrwert für die Spec-Datei bietet und Sie sich der Konsequenzen bewusst sind. Anderenfalls führen Sie lediglich zu wartungsintensiven Diskrepanzen in der Distribution.

BuildRequires

Falls sie nicht automatisch generiert werden, können Sie jetzt die für die Paketerstellung und die Unit-Tests benötigten Abhängigkeiten hinzufügen:

BuildRequires:  golang(github.com/stretchr/testify/assert)
BuildRequires:  golang(github.com/stretchr/testify/require)
BuildRequires:  golang(golang.org/x/crypto/ssh/terminal)

Siehe dieser Abschnitt, um zu erfahren, wie Sie die BuildRequires manuell abrufen können.

Description

Fügen Sie nun die Hauptpaketbeschreibung hinzu:

%description
%{common_description}

Paket-Metadaten

Die Deklaration von Go-Codepaketen wurde mit dem Makro %{gopkg} automatisiert. Es generiert automatisch ein %package und ein %description für alle primären Importpfade und Kompatibilitätspfade.

%gopkg

Wenn Sie nur Go-Entwicklungs-Teilpakete ohne Kompatibilität generieren müssen, verwenden Sie Folgendes:

%godevelpkg

Bei Bedarf können Sie anschließend ein oder mehrere Go-Pakete definieren, die die zu erstellenden Binärdateien enthalten. Siehe dazu den vorherigen Abschnitt Go-Binärpakete.

%prep: %goprep , Vendoring entfernen

%goprep entpackt die Go-Quellarchive und erstellt den Projektverzeichnisbaum „GOPATH“, der im restlichen Teil der Spec-Datei verwendet wird. Es entfernt mitgelieferten („vendored“) Code: Verwenden Sie das Flag -k, wenn Sie diesen mitgelieferten Code behalten möchten, und berücksichtigen Sie die Auswirkungen im restlichen Teil der Spec-Datei.

%goprep

%goprep führt nur eine grundlegende Erkennung von Vendoring durch. Innovative Methoden zum Einbinden von Code werden nicht erkannt. Entfernen Sie den übersehenen Vendoring-Code nach der Zeile %goprep manuell.

%goprep wird die Upstream-Quellen nicht automatisch für Sie korrigieren. Da alle nachfolgenden Makroaufrufe von fehlerfreien Quellen ausgehen, müssen Sie diese direkt nach der Zeile %goprep korrigieren:

  • Aufrufe veralteter Importpfade durch ihren korrekten Wert ersetzen

  • Code-Probleme patchen

  • Totcode entfernen (einige Upstream-Projekte liefern wissentlich fehlerhaften Quellcode aus, in der Hoffnung, dass sich jemand darum kümmert, ihn zu reparieren)

Sie SOLLTEN Korrekturen und Problemberichte an die Entwickler weiterleiten. Jeder verwendete Patch SOLLTE einen Link zu einem entsprechenden Bugreport oder Merge Request enthalten. Mindestens sollte ein Kommentar hinzugefügt werden, der die Gründe für den Patch erläutert.

Wenn Sie einen Importpfad paketieren, der Teil einer Abhängigkeitsschleife ist, benötigen Sie Bootstrapping, um die ersten Bauvorgänge zu verwalten. Für Go-Code bedeutet dies, dass Ihr Bootstrap-Abschnitt Folgendes enthalten sollte:

  • Unit-Tests entfernen, die andere Teile der Schleife importieren

  • Code entfernen, der andere Teile der Schleife importiert

Manchmal lassen sich Abhängigkeitsschleifen auflösen, indem man bestimmte Unterverzeichnisse in ein separates -devel-Teilpaket auslagert. Siehe auch Umgang mit zirkulären Abhängigkeiten.

Automatische BuildRequires

Wenn BuildRequires-Generatoren unterstützt werden, können Sie diese nun zu Ihrem Bauvorgang hinzufügen:

%generate_buildrequires
%go_generate_buildrequires

Paketierung einer Binärdatei: der %build-Abschnitt

Wenn es sich bei Ihrem Paket nur um ein Quellpaket handelt, können Sie diesen %build-Abschnitt komplett überspringen.

Andernfalls müssen Sie zunächst manuell die Projektteile identifizieren, die kompiliert werden können, und festlegen, wie das Ergebnis benannt werden soll. Praktisch gesehen ist jedes Verzeichnis relevant, das einen main()-Abschnitt in Go enthält. In gut organisierten Projekten werden diese in Unterverzeichnissen mit dem Namen cmd abgelegt, die nach dem zu kompilierenden Befehl benannt sind. Dies wird auch hier dokumentiert, ist aber keine allgemeine Regel. Manchmal wird das gesamte Verzeichnis %goipath als eine einzige Binärdatei kompiliert.

for cmd in cmd/* ; do
  %gobuild -o %{gobuilddir}/bin/$(basename $cmd) %{goipath}/$cmd
done

Installieren der Pakete

Quellpaket-Installation

Wenn Sie eine Bibliothek paketieren, führt %gopkginstall Installationsschritte für alle primären Importpfade und Kompatibilitätspfade durch.

%gopkginstall

Wenn Sie nur Go-Entwicklungsteilpakete ohne Kompatibilität installieren müssen, verwenden Sie:

%godevelinstall

Installation eines Binärpakets

Für Binärdateien erstellen wir einfach das Verzeichnis %{_bindir} im Buildroot und installieren die Befehle als ausführbare Dateien darin:

install -m 0755 -vd                     %{buildroot}%{_bindir}
install -m 0755 -vp %{gobuilddir}/bin/* %{buildroot}%{_bindir}/

Seien Sie vorsichtig bei Befehlsnamen, die möglicherweise bereits in Fedora existieren. Im Zweifelsfall können Sie überprüfen, ob der Befehl bereits in Fedora verfügbar ist:

dnf whatprovides --disablerepo="*" --enablerepo=rawhide "/usr/bin/$cmd"

In diesem Fall sollten Sie nach bestem Wissen und Gewissen den Befehl umbenennen.

Ausführen der Unit-Tests: %gocheck

Wie bereits erwähnt, MÜSSEN Sie Unit-Tests in %check ausführen:

%gocheck

Oft ist es jedoch notwendig, einige davon zu deaktivieren. Dafür stehen Ihnen drei Ausschlussflags zur Verfügung:

  • -d <Verzeichnis>: die Dateien im angegebenen <Verzeichnis> ausschließen nicht-rekursiv (Unterverzeichnisse sind nicht ausgeschlossen)

  • -t <Verzeichnisbaumwurzel>: Dateien in der angegebenen <Verzeichnisbaumwurzel> ausschließen rekursiv (Unterverzeichnisse sind ausgeschlossen)

  • -r <Ausdruck>: Dateien ausschließen, die auf den angegebenen <Ausdruck> passen

Vergessen Sie nicht, zu dokumentieren, warum ein Test deaktiviert wurde.

%files-Deklaration

Beim Verteilen von Quellcode

Mit %gopkgfiles wird die in %install erzeugte Dateiliste verarbeitet und die erforderlichen Lizenz- und Dokumentationsdateien werden hinzugefügt:

%gopkgfiles

Beim Ausliefern von Binärdateien

Binärdateien werden üblicherweise im Hauptpaket ausgeliefert. Dieses Paket MUSS die zugehörigen rechtlichen Dokumente und die dazugehörige Dokumentation enthalten.

%files
%license LICENSE
%doc cmd/foo/README.md
%{_bindir}/*

Beispiele

Einfaches Quellpaket

golang-github-stretchr-testify.spec
# https://github.com/stretchr/testify
%global goipath         github.com/stretchr/testify
Version:                1.2.2

%gometa

%global common_description %{expand:
Golang set of packages that provide many tools for testifying
that your code will behave as you intend.

Features include:

 - Easy assertions
 - Mocking
 - Testing suite interfaces and functions}

%global golicenses    LICENSE

Name:           %{goname}
Release:        1%{?dist}
Summary:        Tools for testifying that your code will behave as you intend
License:        MIT
URL:            %{gourl}
Source:         %{gosource}

BuildRequires: golang(github.com/davecgh/go-spew/spew)
BuildRequires: golang(github.com/pmezard/go-difflib/difflib)
BuildRequires: golang(github.com/stretchr/objx)

%description
%{common_description}

%gopkg

%prep
%goprep

%install
%gopkginstall

%check
%gocheck

%gopkgfiles


%changelog
* Thu Mar 21 22:20:22 CET 2019 Robert-André Mauchin <zebob.m@gmail.com> - 1.2.2-1
- First package for Fedora

Paketumbenennungen

golang-github-sirupsen-logrus.spec
# https://github.com/sirupsen/logrus
%global goipath         github.com/sirupsen/logrus
Version:                1.4.0

%gometa

%global goaltipaths     github.com/Sirupsen/logrus

%global common_description %{expand:
Logrus is a structured logger for Go (golang), completely API compatible with
the standard library logger.}

%global golicenses    LICENSE
%global godocs        *.md

Name:           %{goname}
Release:        1%{?dist}
Summary:        Structured logger for Go
License:        MIT
URL:            %{gourl}
Source:         %{gosource}

BuildRequires: golang(golang.org/x/crypto/ssh/terminal)
BuildRequires: golang(github.com/stretchr/testify/assert)

%description
%{common_description}

%gopkg

%prep
%goprep

%install
%gopkginstall

%check
%gocheck

%gopkgfiles


%changelog
* Wed Oct 31 2018 Robert-André Mauchin <zebob.m@gmail.com> - 1.4.0-1
- First package for Fedora

Einfaches Binärpaket

golang-github-boltdb-bolt.spec
# https://github.com/square/go-jose
%global goipath         gopkg.in/square/go-jose.v2
%global forgeurl        https://github.com/square/go-jose
Version:                2.1.9

%gometa

%global common_description %{expand:
Package jose aims to provide an implementation of the Javascript Object
Signing and Encryption set of standards. This includes support for JSON Web
Encryption, JSON Web Signature, and JSON Web Token standards.}

%global golicenses    LICENSE
%global godocs        *.md

%global godevelheader %{expand:
# The devel package will usually benefit from corresponding project binaries.
Requires:  %{name} = %{version}-%{release}
}

Name:           %{goname}
Release:        1%{?dist}
Summary:        An implementation of JOSE standards (JWE, JWS, JWT) in Go
# Detected licences
# - *No copyright* Apache License (v2.0) at 'LICENSE'
# json/ is BSD-3-Clause
License:        Apache-2.0 AND BSD-3-Clause
URL:            %{gourl}
Source:         %{gosource}

BuildRequires: golang(golang.org/x/crypto/ed25519)
BuildRequires: golang(golang.org/x/crypto/pbkdf2)
BuildRequires: golang(github.com/stretchr/testify/assert)
BuildRequires: golang(gopkg.in/alecthomas/kingpin.v2)

%description
%{common_description}

%gopkg

%prep
%goprep

%build
for cmd in jose-util jwk-keygen; do
  %gobuild -o %{gobuilddir}/bin/$(basename $cmd) %{goipath}/$cmd
done

%install
%gopkginstall
install -m 0755 -vd                     %{buildroot}%{_bindir}
install -m 0755 -vp %{gobuilddir}/bin/* %{buildroot}%{_bindir}/

%check
%gocheck

%files
%license %{golicenses}
%doc %{godocs}
%{_bindir}/*

%gopkgfiles

%changelog
* Thu Mar 21 21:59:10 CET 2019 Robert-André Mauchin <zebob.m@gmail.com> - 2.1.9-1
- First package for Fedora