Jak poprawnie dystrybuować tool CLI?

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ć?

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?

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

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

1

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

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ąć.

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.

0
Riddle napisał(a):

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

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:

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:

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.

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ść:

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.):

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

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

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).

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.