Czy menedżer pakietów powinien zmodyfikować plik .bashrc?

9

Piszę pakiet dla czegoś, co wymaga ustawienia zmiennej środowiskowej w celu poprawnego wykonania. Czy krok instalacji menedżera pakietów powinien zmodyfikować środowisko użytkownika, czy po prostu zachęcić użytkownika do zrobienia tego sam? Moja intuicja byłaby tym drugim, ale widzę argumenty za tym pierwszym.

David Cowden
źródło
7
Czy możesz sprawić, że coś będzie działało lepiej, usuwając zależność od zmiennej środowiskowej (np. Używając zamiast tego pliku konfiguracyjnego)? Wydaje .bashrcmi się, że byłoby to lepsze niż pakowanie hacków lub mieszanie z nimi .
Jasne, ale powiedzmy na potrzeby tego pytania, że ​​modyfikacja aplikacji nie jest opcją.
David Cowden
1
Co jeśli użytkownik nie działa bash? Dostępnych jest wiele alternatywnych powłok z szeroką gamą plików startowych. Poważnie sugeruję znalezienie tutaj alternatywnego rozwiązania.
Jules
10
Napisz wokół niego opakowanie. Zobacz na przykład, tomcatktóry potrzebuje kilku zmiennych środowiskowych do poprawnego działania; wszystkie są ustawione przez skrypt startowy, który jest uruchamiany zamiast bezpośredniego uruchamiania jego pliku binarnego.
Jules
1
@Vality Wiem. Propozycja Julesa została już zasugerowana. Jestem żartobliwy - żartuję sobie z okrągłej logiki, aby najpierw argumentować, że powinienem mieć rozwiązanie agnostyczne powłoki, a następnie zasugerować użycie skryptu powłoki jako rozwiązania. To żart (;
David Cowden

Odpowiedzi:

18

Czy krok instalacji menedżera pakietów powinien zmodyfikować środowisko użytkownika, czy po prostu zachęcić użytkownika do zrobienia tego sam?

Ani. Instalatorzy pakietów nigdy nie powinni dotykać niczego w katalogu domowym dla konta, którego pakiet nie jest właścicielem. Pakiety powinny się również konfigurować tak, aby po ich zainstalowaniu były użyteczne bez specjalnego wysiłku ze strony użytkownika. (Są wyjątkowe przypadki, w których nie chcesz tego robić, ale jest ich niewiele i są bardzo odległe).

Środowiska Unixy mają miejsce na umieszczanie plików konfiguracyjnych, które są odczytywane za każdym razem, gdy użytkownik uruchamia powłokę logowania. W przypadku powłok Bourne i C możesz wstawić swoją konfigurację odpowiednio do /etc/profilei /etc/csh.cshrc. (Nie zapomnij go usunąć podczas odinstalowywania).

Wiele systemów obsługuje to także przy użyciu pojedynczych plików, co ułatwia dodawanie i usuwanie fragmentów konfiguracji bez konieczności upuszczania tekstu w dowolne miejsce w jednym pliku. (Daje to również wszystkie korzyści związane z kontrolą i odpowiedzialnością, które można uzyskać od menedżera pakietów.) Niektóre dystrybucje skonfigurują /etc/profileodczyt wszystkich pasujących plików /etc/profile.d/*.sh.

Blrfl
źródło
1
Historycznie rcnazwa skryptu pochodzi od CTSSruncom (Run Commands), ale od tego czasu rozszerzyła się o inne znaczenia.
Jeffrey Hantin
1
@JeffreyHantin: Touché. Oddalony.
Blrfl
1
Nienawidzę wybierać, ale profile.dnie jest wbudowany w bash, jest to haczyk zwykle dostarczany z (zwykle podstawy dystrybucji) /etc/profile. ;)
Jeffrey Hantin
1
@JeffreyHantin: To prawda, chociaż nie będzie krytyki mojego użycia słowa „Unixy”. :-)
Blrfl
14

To nie do przyjęcia, aby zmodyfikować użytkownika /homestrukturę z menadżera pakietów, chyba że modyfikacja jest cały punkt.

Główne podejścia do tego są następujące:

  • Powiadom użytkownika, że ​​musi go skonfigurować.
  • Podaj wartości domyślne, aby nie były potrzebne
  • Spakuj skrypt uruchamiający, który odpowiednio ustawia wartości
  • (Jeśli dystrybucja to obsługuje) Upuść plik eksportujący zmienną środowiskową do wewnątrz /etc/profile.d. W niektórych systemach Linux, wszystkie skrypty w tym katalogu są pobierane przez domyślną konfigurację powłoki, więc możesz bezpiecznie ustawić tam zmienną.
Daenyth
źródło
7

Pytanie Czy krok instalacji menedżera pakietów powinien zmodyfikować środowisko użytkownika?

Odpowiedź Nie. Zmodyfikowanie danych użytkownika to zły pomysł, w tym przypadku plik .bashrc. Dane użytkownika powinny być uważane za święte przez menedżera pakietów?

Pytanie Czy krok instalacji menedżera pakietów powinien po prostu zachęcić użytkownika do zrobienia tego sam?

Odpowiedź To rozwiązanie jest o wiele smaczniejsze, ale wciąż nie jest idealne.

Myślę, że powinieneś utworzyć skrypt powłoki opakowania, w którym możesz ustawić niezbędne zmienne środowiskowe, a następnie uruchomić plik wykonywalny.

R Sahu
źródło
Rozważałem też ten pomysł. Projekt jest młody i dojdzie do punktu, w którym nie będzie to konieczne.
David Cowden
@ GlenH7 Zaktualizowałem swoją odpowiedź. Mamy nadzieję, że zaktualizowana odpowiedź jest odpowiedzią, której szukasz.
R Sahu
@ GlenH7: To pytanie jest zasadniczo problemem XY: meta.stackexchange.com/questions/66377/what-is-the-xy-problem , gdzie potrzeba zmiennych środowiskowych jest prawdziwym problemem do rozwiązania.
whatsisname
Co więcej, sugestia tej odpowiedzi, aby utworzyć skrypt opakowania, jest jedyną odpowiedzią, która będzie działać dla wszystkich powłok.
whatsisname
1
@MattThomason, że zrozumienie skłoniło mnie do zadania pytania (;
David Cowden,
5

Tęsknisz za lasem za drzewami. Oczywiście wygodniej jest przeprowadzić zmianę środowiska dla użytkownika, ale jest to również bardziej ryzykowne i nieco inwazyjne. Powinieneś połączyć to, co najlepsze z obu światów, pytając użytkownika, czy instalator powinien je zmodyfikować .bashrc, a w przeciwnym razie podaj instrukcje, jak powinien to zrobić sam.

Kilian Foth
źródło
Dzięki za radę. Nigdy wcześniej nie pisałem paczki publicznej i chcę się upewnić, że nie zrobię czegoś tabu.
David Cowden
W ten sposób pakiet SDK Google Cloud obsługuje to dzisiaj. Pyta, czy chcesz zmodyfikować pliki startowe.
jmq
1

Zakładasz, że „użytkownik” jest liczbą pojedynczą. Co się stanie, jeśli mam tysiące użytkowników w tym systemie?

Zakładasz, że możesz nawet znaleźć katalog domowy użytkownika. Jeśli użytkownikami zarządza się np. Przez LDAP, może nie być możliwe uzyskanie listy wszystkich ważnych użytkowników. Katalogi domowe mogą nie znajdować się w katalogu / home; mogą być dynamicznie montowane z sieci. Katalog domowy użytkownika może być zaszyfrowany, a klucz niedostępny, gdy nie są zalogowani.

Nie ma sposobu, aby zrobić to niezawodnie w każdej możliwej sytuacji. Użyj mechanizmu dystrybucji do ustawiania zmiennych środowiskowych dla użytkowników podczas logowania lub odradzania powłok. Jeśli to nie zadziała, napisz opakowanie. (Opakowanie może również być binarny, jeśli to konieczne, aby rozwiązać ten argument w komentarzach).

pjc50
źródło
0

Ustawienie zmiennej globalnej w pakiecie jest dopuszczalne, jeśli jest to zmienna zdefiniowana przez twój projekt (a to oznacza, że ​​nazwa projektu jest częścią nazwy zmiennej!). Nawet wtedy nie powinieneś dotykać .bashrcpliku użytkownika - zamiast tego powinieneś dodać skrypt do /etc/profile.d .

Idan Arye
źródło