Secundo PM - Projektverwaltung für GitHub
-
SecundoPM - Einfaches installieren und entfernen von GitHub Paketen (auf Linux)
Disclaimer: Ich übernehme keine Haftung für Beschädigung von Daten
oder deren Verlust. Außerdem distanziere ich mich von allen Projekten,
die SecundoPM als Paketmanager benutzen und nicht in den GitHub-Accounts
von https://github.com/triploit/ oder https://github.com/survari/
enthalten sind. Jeder, der diesen Paketmanager benutzt, tut dies mit
eigener Verantwortung.Ihr habt ein supertolles Tool entwickelt, das Usern helfen soll, aber keine Ahnung wie ihr es ihnen auf Linux bereit stellt?
Hier ist die Lösung! Um aufwendiges Kompilieren und verschieben von Dateien nicht dem User zu überlassen, habe ich einen einfachen Paketmanager gebaut.Lasst uns ihn folgendermaßen auf Linux installieren:
git clone https://github.com/triploit/secundo-pm cd secundo-pm make ./secpm install triploit:secundo-pm cd .. rm -rf secundo-pm
Offiziell gibt es keinen Windows-Support. Da Windows sich kompliziert im Umgang mit der Shell gestaltet, habe ich auch keinen Windows-Support geplant. Dies bedeutet jedoch nicht, dass ich so ein Feature nicht dulden würde. Ich freue mich immer, wenn jemand mitentwickelt.
Wie man ein Paket erstellt
Und hier wird man auch gleich sehen, warum der Disclaimer oben
existiert:Möchte man nun sein GitHub-Projekt in ein SecundoPM Paket umwandeln, muss ein Ordner mit dem Namen "pkg" im Wurzelverzeichnis des Projektes angelegt werden. In diesem Ordner wird nun eine Datei angelegt, mit dem Namen "ins.sc". Das muss dann so aussehen:
meinprojekt ├── main.cpp ├── main.hpp └── pkg └── ins.sc
In diese Datei kommen nun das Installationsskript rein. Schreiben wir mal Folgendes:
user nutzername name projektname ver 0.0.0.1 dep nutzername:dependencyname 0.0.0.1 func install { echo "Kompiliere ..." g++ main.cpp -o programm echo "Installiere ..." sudo mv programm /usr/bin/programm echo "Fertig !" } func update { &install }
So, was wir hier sehen ist also eine einfache Form des Skriptes. Wir haben verschiedene Funktionen definiert. Funktionen in SC (SeCundo script) können keine Argumente oder Parameter entgegennehmen. Weiterhin ist es möglich Funktionen aufzurufen, indem man in einer leeren Zeile
&funktionsname
schreibt.Funktionen, die als Standart erwartet werden, sind:
- install - Zum Installieren von Paketen
- update - Zum Aktualisieren von Paketen
- remove - Zum Löschen von Paketen
Wichtig ist außerdem, dass ihr die Befehle
user
,name
,ver
unddep
beachtet.Befehl Aufbau Bedeutung user
user [nutzer]
Der Nutzer des GitHub-Paketes wird festgelegt. Liegt die Repository in einer Organisation, muss dort der Organisationsname stehen, wie im GitHub-Link name
name [projektname]
Der Name der Repository muss hier stehen. Genau wie im GitHub-Link. (bspw. wäre es bei SecundoPM secundo-pm
, da die Repository im Link https://github.com/triploit/secundo-pm ebensecundo-pm
heißt.)ver
ver [Major].[Minor].[Revision].[Build]
Hier muss die Projekt-Version stehen. Die Version ist immer eine Kette bestehend aus vier Zahlen, die mit Punkten verbunden werden. Es dürfen keine Buchstaben o.ä. verwendet werden. dep
dep [nutzer]:[projekt] Ma.Mi.R.B
Macht das Projekt von dem SecPM Paket https://github.com/nutzer/projekt mit der Version Ma.Mi.R.B Abhängig. Wenn wir uns das Skript nun weiter anschauen, fällt folgendes auf: Shellbefehle. In den Funktionen stehen Shellbefehle. Und daher auch der Disclaimer. SecPM fragt zwar vor dem installieren, ob man die Skript-Datei vorher sehen will, jedoch installiert man immer auf eigene Gefahr.
Wichtig ist hier noch zu sagen: Die Funktionen sind kein Shellscript. Sie werden zeilenweise unabhängig voneinander ausgeführt.
Wenn ihr Variablen und ein eigenes Shellscript nutzen wollt, geht das folgendermaßen:
func install { <[ echo "Dies ist ein vollwertiges Shellscript!"; i="Hallo Welt!"; echo $i; ]> }
Alles was in
<[ ... ]>
steht, wird als eine komplette Datei ausgeführt.
Verkürzt geht das natürlich auch so:func install {<[ echo "Dies ist ein vollwertiges Shellscript!"; i="Hallo Welt!"; echo $i; ]>}
Pakete installieren, entfernen, ...
Installation
sudo secpm install triploit:aml
Das Paket https://gitub.com/triploit/aml wird installiert.
sudo secpm ins triploit:aml ins triploit:tsmi
Abkürzung für "install" ist "ins". Die Pakete https://github.com/triploit/aml und https://github.com/triploit/tsmi werden installiert.
sudo secpm install mustermax:projekt
Das Paket https://github.com/mustermax/projekt wird installliert.
Alternativ zu
install
gibt es auch den Parameter-I
.Entfernen
sudo secpm remove triploit:aml
Das Paket https://gitub.com/triploit/aml wird entfernt.
sudo secpm rem triploit:aml rem triploit:tsmi
Abkürzung für "remove" ist "rem". Die Pakete
https://github.com/triploit/aml und https://github.com/triploit/tsmi
werden entfernt.sudo secpm rem mustermax:projekt
Das Paket https://github.com/mustermax/projekt wird entfernt.
Alternativ zu
remove
gibt es auch den Parameter-S
.Aktualisieren
Um Pakete zu aktualisieren:
sudo secpm update triploit:aml up triploit:tsmi
Alternativ zu
update
gibt es auch den Parameter-U
.
Oder, um alle Pakete zu aktualisieren (funktioniert nur bei Paketen, die mit SecPM 1.4/1.4+ installiert wurden):sudo secpm update all
Alternativ zu
update all
gibt es auch den Parameter-Ua
.Installieren von lokalen Paketen
sudo secpm local /pfad/zum/projekt/
Der Ordner
/pfad/zum/projekt/
wird installiert. Das Skript
/pfad/zum/projekt/pkg/ins.sc
wird ausgeführt.Leuten vertrauen
Da jedes Paket eine potentielle Gefahr ist, fragt SecPM ob man das Installer-Script vor dem Installieren
ansehen möchte und fragt danach noch einmal, ob man sicher ist, dass man das Paket installieren möchte.
Es gibt nun die Möglichkeit, für bestimmte Organisationen oder GitHub-Accounts, denen man wirklich
vertrauen sollte, diese Nachrichten auszuschalten:sudo secpm trust user
Ich, zum Beispiel, vertraue mir selbst
sudo secpm trust survari trust triploit
Um einen Nutzer von der Liste vertrauenswürdiger Personen zu entfernen, gibt es:
sudo secpm untrust user
Alle Leute anzeigen, denen man vertraut:
sudo secpm showtrust
Leuten nicht mehr vertrauen:
sudo secpm untrust user
Keine Ausgaben!
Um zu verhindern, dass die Installtionsskripte ausgaben tätigen, kann man das Argument
quiet
als erstes schreiben:sudo secpm quiet update all
Alle Pakete werden aktualisiert, ohne Ausgaben von den Installationsskripten. Manchmal funktioniert das aber leider nicht ganz, wie gewollt.
Und noch vieles mehr!
Es gibt noch viele weitere Funktionen, die man benutzen kann. Dazu einfach:
sudo secpm help
Die Sprache kann man zum Beispiel auf Deutsch stellen, indem man die Konfig bearbeitet. Nach der Installation dazu einfach:
sudo secpm config
Dann öffnet vi die Konfigurationsdatei (liegt in:
/usr/share/secundo/conf/config.yml
).
Dort könnt ihr folgende Optionen abändern, um es auf deutsch zu stellen:langcfg: /usr/share/secundo/lang/en.yml
müsst ihr auf
langcfg: /usr/share/secundo/lang/de.yml
abändern. Weitere Sprachen gibt es unter
/usr/share/secundo/lang
. Ihr könnt auch Weitere übersetzen. Kopiert euch einfach dazu eine der Sprachdateien heraus, übersetzt die Sätze in die gewünschte Sprache und ändert den Dateinamen in die Sprachabkürzung der von euch gewählten Sprache. Für Deutsch ist es zum Beispielde.yml
, für Englischen.yml
, usw.Ihr könnt auch den Editor ändern, mit dem ihr die Konfigurationsdatei per
sudo secpm config
öffnet.
Einfach beieditor: /usr/bin/vi
den Pfad zum Editor eintragen. Bei mir ist es zum Beispiel:
editor: /usr/bin/nano
GitHub
Das Projekt findet ihr hier: https://github.com/triploit/secundo-pm
-
Wozu? Was sind die Unterschiede zu anderen Paketmanagern?
Hab ganz grob über den Code drübergeschaut, toll find ich den nicht. Zumindest würde ich von einem "professionellen" System mehr erwarten.
-
@mechanics
Naja "professionell" ist er schonmal gar nicht.
Der Unterschied zu anderen Paketmanagern ist, dass ich mir ehrlich gesagt nie groß diese Frage gestellt habe. Eigentlich sollte SecPM nur ein bisschen zum Testen sein. Daher sieht auch der Code dementsprechend zusammengeschustert aus (hast aber recht, muss ich wirklich mal aufräumen).Spontan fallen mir nur Folgendes ein:
- sprachunabhängig (egal ob C++, Python, Java, NodeJS, o.ä.)
- besitzt im Gegensatz zu vielen anderen Paketmanagern keinen eigenen Server, nutzt daher gleich GitHub
- einfach in der Verwaltung und im Erstellen eigener Pakete (PKGBUILD's und hochladen in die AUR find ich aus der Sicht komplizierter)
- mit Liebe gemacht ...?
Ehrlich gesagt, fällt mir nicht viel ein. Aber genau aus dem Grund hab ich den Thread ja erstellt, um mal ein bisschen kritisiert und hinterfragt zu werden
-
@survari sagte in Secundo PM - Projektverwaltung für GitHub:
Aber genau aus dem Grund hab ich den Thread ja erstellt, um mal ein bisschen kritisiert und hinterfragt zu werdenIch finde es schwierig, etwas zu hintefragen, wenn man sich damit nicht intensiv befasst hat
Es ist dein Projekt, du hast dich viel intensiver damit beschäftigt als andere, also müsstest du zuerst mal irgendwelche Anhaltspunkte für eine Diskussion liefern.
Es gibt schon etablierte Systeme, und es gibt relativ neue wie flatpak und snap. Die Probleme scheinen nicht komplett gelöst zu sein, sonst würde es ja keinen Bedarf an sowas geben. Mir selber ist das relativ egal, ich hatte noch nie ein Problem, einen Paketmanager zu benutzen. Musste aber auch noch nie selber ein Paket erstellen, das ich vertreiben wollte, das scheint eher der Knackpunkt zu sein.
Also, wenn du jetzt kommst, und wieder mal was neues präsentierst, denk ich mir erstmal natürlich, schon wieder was, was keiner braucht. Solltest also schon etwas fundierter begründen, warum dein Projekt cooler ist als die anderen
-
p.s. Ich weiß nicht, ob man deinen Code "aufräumen" sollte, das betrifft eher die Gesamtstruktur, dazu kann ich nichts sagen. Aber was mir beim Drüberschauen negativ aufgefallen ist, ist das oft fehlende const (und Parameterübergabe per Referenz) und string Initialisierungen mit = "". Und ich hatte eine Hilfsfunktion zum Splitten gesehen, das schaut sehr ineffizient aus. Mag egal sein, aber für unnötig ineffizienten Code werd ich mich nie begeistern können
-
Mag egal sein, aber für unnötig ineffizienten Code werd ich mich nie begeistern können
Oh gott, dann würdest du wohl meine ganzen anderen Projekte auch hassen
Naja, immerhin hab ich erstmal ein paar Eindrücke bekommen.Mir selber ist das relativ egal, ich hatte noch nie ein Problem, einen Paketmanager zu benutzen. Musste aber auch noch nie selber ein Paket erstellen, das ich vertreiben wollte, das scheint eher der Knackpunkt zu sein.
Genau das ist leider der Knackpunkt. Es ist so unglaublich schade... Es gibt so viele Paketmanager, aber keiner besinnt sich auf Einfachheit beim Erstellen von Paketen. Die Dokumentationen sind meist sehr komplex formuliert, mir wenigen Beispielen. Die Paketmanager lassen die Installationsskripte auf komplizierteste Weisen ausführen. Das ist Schade und genau das versucht SecPM auch anders zu machen. Ein Paket in SecPM zu erstellen, bedeutet ein einziges Shellscript hinzuzufügen und dem Nutzer das Clonen und Installieren per Hand abzunehmen. Viele andere setzen außerdem auf eigene Repository-Server, das ist unnötig. (Fast) Jeder Entwickler, der OpenSource Projekte verbreiten will, nutzt GitHub. Warum sollte ein Entwickler sein Projekt denn bitte auf einen extra Server hochladen? Unnötige Arbeit.
Ich finde es schwierig, etwas zu hintefragen, wenn man sich damit nicht intensiv befasst hat
Es ist dein Projekt, du hast dich viel intensiver damit beschäftigt als andere, also müsstest du zuerst mal irgendwelche Anhaltspunkte für eine Diskussion liefern.
Das fällt mir schwieriger als du denkst
, aber ein paar hab ich ja grad geschrieben.
Aber was mir beim Drüberschauen negativ aufgefallen ist, ist das oft fehlende const (und Parameterübergabe per Referenz) und string Initialisierungen mit = "".
Okay, das mit der Pass-by-Reference wurd mir schon öfter gesagt, das muss ich wirklich ändern. Hast recht.
Aber was hat es mit der Initialisierung mit= ""
aus sich, warum ist es schlecht? (Wie du merkst, C++ programmiere ich zwar, verstehen tue ich von der Sprache aber nichts)
-
@survari sagte in Secundo PM - Projektverwaltung für GitHub:
Aber was hat es mit der Initialisierung mit
= ""
aus sich, warum ist es schlecht?Das ist völlig sinnlos und kontraproduktiv. Jede Klasse sollte sowieso unbedingt einen Default Konstruktor haben, der sie sinnvoll auf "leer" initialisiert (wenn sie einen Default Konstruktor hat, gibt natürlich auch Klassen, bei denen das keinen Sinn macht). Aber eine Klasse, die du auf leer initialisierst schaut seltsam aus. Außerdem weiß hoffentlich jeder, was der std::string default Konstruktor macht.
Und ein string ist auch kein nativer Datentyp in C++, das schaut dann so nach Java/C# aus, wenn du strings initialisierst...
-
@mechanics
Ja, verstehe. Und beim Lesen dachte ich mir nur so "Ich mach das so, weil ich seit Java Angst vor nicht initialisierten Strings habe"Das ist der Nachteil, wenn man mehrere Programmiersprachen programmiert. Oder wie ein Freund von mir sagte: "Es ist nicht einfacher, eine neue Programmiersprache zu lernen, wenn man schon einige kann. Man erstellt bloß falsche Zusammenhänge."