Jak poprawnie dystrybuować tool CLI?

Jak poprawnie dystrybuować tool CLI?
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:Koszalin
  • Postów:10094
0

Napisałem sobie taki toolik w pythonie, crlf: https://github.com/t-regx/crlf do podmianki końcówek linii w plikach, i chciałbym tak zrobić żeby userzy na linuxie i windowsie mogli w jakiś prosty i defaultowy sposób go sobie pobrać i zainstalować, najlepiej jedną, standardową komendą.

Jak to odpowiednio zrobić?

Patryk27
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:Wrocław
  • Postów:13042
1

AFAIR nie ma innej opcji niż ręczne wrzucenie tej aplikacji do Chocolatey, Brew, Nixpkgs, repozytoriów Ubuntu itd.

Jako taki low-hanging fruit ludzie często tworzą po prostu Dockerfile, sprowadzając instalację do docker build / docker run, choć ja na taki sposób korzytania z Dockera dostaję wzdęć i palpitacji 🙃

Edit: a, oki, to jest Python - to może istnieje jakiś odpowiednik npmowego npx dla Pythona?


edytowany 2x, ostatnio: Patryk27
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:Koszalin
  • Postów:10094
0

No właśnie ostatecznie pewnie chciałbym tak zrobić; tylko wiem że są różne sposoby dystrybucji, jakieś setuptools, pyinstaller, eggs, wheels, sdist, bdist, etc. nie znam dokładnych różnic między nimi i nie wiem którego dobrze użyć.

Idealnie by było jakby się dało tak zrobić że ktoś robi

Kopiuj
apt-get install riddle-crlf

:D

Patryk27 napisał(a):

AFAIR nie ma innej opcji niż ręczne wrzucenie tej aplikacji do Chocolatey, Brew, Nixpkgs, repozytoriów Ubuntu itd.

Co do ręcznego wrzucenia, to chciałbym jakoś zautomatyzować wrzucenie kolejnych wersji.

Patryk27 napisał(a):

Jako taki low-hanging fruit ludzie często tworzą po prostu Dockerfile, sprowadzając instalację do docker build / docker run, choć ja na taki sposób korzytania z Dockera dostaję wzdęć i palpitacji 🙃

Dobrze to wyczułeś, bo ja też dostaję :D I raczej podziękuję za takie cóś :D

edytowany 3x, ostatnio: Riddle
DB
  • Rejestracja:ponad 9 lat
  • Ostatnio:5 miesięcy
  • Postów:227
1

Zrob paczke pip-owa zrobisz wersjonowanie i wszystko co tam Ci potrzeba.

Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:Koszalin
  • Postów:10094
0
DolBo napisał(a):

Zrob paczke pip-owa zrobisz wersjonowanie i wszystko co tam Ci potrzeba.

A jak zainstalować taką paczkę w OS jako standalone-tool?

Poza tym ja chciałem żeby użytkownicy windowsa którzy nie mają zainstalowanego pythona tez mogli to łatwo ściągnąć.

KE
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 2 godziny
  • Postów:684
1

TYLKO statyczne binarki, self-contained beż żadnych zależności, do ściągnięcia z githuba albo innego CDN curl-em z ew. sumą kontrolną. Niestety dystrybucja softu na Linuksy jest pofragmentowana koszmarnie i tylko się napocisz utrzymaniem tego. Trochę niepopularna opinia, ale co tam.

JV
  • Rejestracja:ponad 6 lat
  • Ostatnio:3 miesiące
  • Postów:242
0
Riddle napisał(a):

Idealnie by było jakby się dało tak zrobić że ktoś robi

Kopiuj
apt-get install riddle-crlf

Co prawda nie apt-get ale łatwo da się z dpkg. Załóżmy że twój skrypt to mycli. Potrzebujesz plik control oraz ewentualnie inne pliki, np. manual mycli.1, etc. Oto struktura katalogów:

Kopiuj
riddle-tools_1.0.0_any
├── DEBIAN
│   └── control
└── usr
    └── local
        ├── bin
        │   └── mycli
        └── share
            └── man
                └── man1
                    └── mycli.1

zawartość control mogłaby wyglądać np. tak:

Kopiuj
Package: riddle-tools
Version: 1.0.0
Section: custom
Depends: python3:any
Architecture: all
Essential: no
Maintainer: example <example@example.com>
Homepage: https://example.com
Description: my fancy cli
 Siala baba mak
 nie wiedziala jak

Teraz wystarczy uruchomić polecenie dpkg-deb --build riddle-tools_1.0.0_any i to powinno stworzyć plik riddle-tools_1.0.0_any.deb,
który możesz zainstalować poleceniem sudo dpkg -i riddle-tools_1.0.0_any.deb a odinstalować sudo dpkg -r riddle-tools

Zaleta *.deb w porównaniu do wheel instalowanej poleceniem pip jest taka, że na linuksie nie potrzebujesz paczki python3-pip, która to z kolei instaluje
build-essential (czyli gcc, make, libc6-dev). Do instalowania w budowanym kontenerze w sam raz.

Poza tym ja chciałem żeby użytkownicy windowsa którzy nie mają zainstalowanego pythona tez mogli to łatwo ściągnąć.

Można użyć np. pyinstaller. Trzeba utworzyć nowe środowisko virtualenv, pipenv, etc. Po uaktywnieniu środowiska zainstalować pip install pyinstaller a następnie tylko niezbędne moduły, żeby nieużywane czasem nie wylądowały w paczce. Wtedy wywołujesz polecenie pyinstaller --onefile myscript.py, w katalogu dist powinien zostać wygenerowany jeden wielki plik wykonywalny a w środku cały python wraz ze skryptem i wszystkimi niezbędnymi bibliotekami. Będzie to spore, u mnie zainstalowany moduł pyside2 władował się do exeka i utuczył go do 65MB mimo że mój skrypt go nie używa. Ale prosty skrypt bez dodatkowo instalowanych modułów wyniósł ok 10MB.

KE
Chciałbym żeby było tak prosto, niestety świat nie kończy się na debianopodobnych distro :)
YA
  • Rejestracja:około 10 lat
  • Ostatnio:około 3 godziny
  • Postów:2371
0

Na linuxie jest dos2unix/unix2dos/mac2unix/unix2mac, które ogarnia temat wspomnianej aplikacji. To tak na marginesie.

Co do dystrybuowania, to żeby się uniezależnić od mnogości dystrybucji i różnych managerów, to można tworzyć samorozpakowujące się archiwum. Wówczas użytkownik ma możliwość:

Kopiuj
wget http://link/paczka.sh
chmod +x paczka.sh
./paczka.sh

np.

Takie archiwum może mieć różne przełączniki (np. mówiące gdzie rozpakować, czy robić instalację w silent mode, czekać aż użytkownik potwierdzi zapoznanie się z licencją etc.):

Kopiuj
sudo  ./paczka.sh --prefix /usr/local
./paczka.sh --prefix $HOME/

W ten sposób nie musisz tworzyć *.rpm, *.deb, *.pkg

Patryk27
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:Wrocław
  • Postów:13042
1

Jeśli już bundle'ować, to imo lepszym wyjściem będzie https://github.com/matthewbauer/nix-bundle - to taka aplikacja, która bierze nixowy pakiet i buduje całkowicie self-contained apko-skrypt, który zadziała na każdym Linuksie o zgodnej architekturze, bez konieczności instalacji (można sobie zrobić portable wersję nawet i Firefoxa!).

Podejście z makeself (oraz innymi rozwiązaniami opartymi o archiwa) prędzej czy później rozbije się o wersje glibc (tj. aplikacja skompilowana na systemie z nowszym glibc nie odpali się na systemie ze starszym glibc) lub o systemy z niestandardowym FHS (tj. takie, które mają linker w innym miejscu niż wskazują metadane w binarce - np. NixOS).


edytowany 3x, ostatnio: Patryk27
YA
Samorozpakowujące się archiwum to tylko opakowanie, to co w środku zależy od użytkownika (jak będzie budował statyczną binarkę, to czemu miałoby się rozbijać o wersje glibc?) Jak będzie polegał na bibliotekach OS, to jest spora szansa, że będzie tak jak napisałeś.
Patryk27
Nawet jak nie glibc (bo zbundluje statycznie), to pozostaje kwestia linkera, c'nie? 👀
YA
Zasiałeś ziarno niepewności :) Co masz na myśli z tym linkerem? Do tej pory byłem przekonany, że jak masz statycznie zbudowaną binarkę, to nie masz zależności od bibliotek zewnętrznych.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.