„sudo gem install” lub „gem install” i lokalizacje klejnotów

140

Uruchomienie „ sudo gem list --local” i „ gem list --local” daje różne wyniki. Moja ścieżka klejnotów jest ustawiona na mój folder domowy i zawiera tylko klejnoty z „ gem list --local”.

Prawdopodobnie nie jest dobrze mieć klejnoty zainstalowane w różnych katalogach na moim komputerze, więc czy powinienem ustawić inną ścieżkę do klejnotów i czy powinienem zawsze używać sudopodczas instalowania czegoś?

my ~/.profile
export PATH=/opt/local/bin:/opt/local/sbin:$PATH
export PATH="/usr/local/bin:/usr/local/sbin:/usr/local/mysql/bin:$PATH"

~ / .bash_profile jest pusty.

raphael_turtle
źródło
1
Myślę, że to ważne pytanie dla tych z nas, którzy muszą używać klejnotu, który wymaga uprawnień roota.
Kelly
Powiązane: stackoverflow.com/questions/21141584/… . Używam rbenv do zarządzania wersjami Rubiego i napotkałem problem, ponieważ użyłem sudo gem install railszamiast gem install rails.
Dennis
3
„Myślę, że to ważne pytanie dla tych z nas, którzy muszą używać klejnotu wymagającego uprawnień roota”. Myślę, że każdy klejnot, który wymaga uprawnień roota, do zainstalowania lub do uruchomienia, jest wysoce podejrzany. Klejnoty powinny móc działać w piaskownicy i działać z uprawnieniami użytkownika.
Tin Man
1
sudoto naładowany pistolet wycelowany w twoją stopę. Używanie go bez zrozumienia, co robi i jak może wpłynąć na twój system, jest jak pociągnięcie za spust z zamkniętymi oczami. Możesz zrobić dziurę w stopie, ale tak czy inaczej nie chcesz ryzykować, chyba że wiesz, jak cofnąć obrażenia. Używanie sudozapisów do należącego do systemu Rubiego, który w systemie Mac OS został zainstalowany przez Apple do ich własnych celów. Możemy na tym polegać, ale zmiana niewłaściwej rzeczy może złamać ich kod. Dlatego instalujemy ze źródła lub używamy czegoś innego do instalacji, gdzie możemy to bezpiecznie dostosować.
Tin Man

Odpowiedzi:

146

W przeciwieństwie do wszystkich innych postów, których NIE sugeruję używać sudo podczas instalowania klejnotów.

Zamiast tego polecam zainstalowanie RVM i rozpoczęcie szczęśliwego życia z przenośnymi domami z klejnotami i różnymi wersjami Ruby mieszkającymi pod jednym dachem.

Dla niewtajemniczonych z dokumentacji :

RVM to narzędzie wiersza poleceń, które pozwala nam łatwo instalować, zarządzać i pracować z wieloma środowiskami ruby ​​i zestawami klejnotów.

Powodem, dla którego instalowanie klejnotów za pomocą sudojest gorsze niż tylko, gem installjest to, że instaluje klejnoty dla WSZYSTKICH UŻYTKOWNIKÓW jakoroot . Może to być w porządku, jeśli jesteś jedyną osobą używającą maszyny, ale jeśli nie, może to powodować dziwności.

Jeśli zdecydujesz, że chcesz wysadzić wszystkie swoje klejnoty i zacząć od nowa, znacznie łatwiej i bezpieczniej jest to zrobić jako użytkownik inny niż root.

Jeśli zdecydujesz, że chcesz użyć, RVMużycie sudospowoduje wszelkiego rodzaju dziwności, ponieważ każda wersja Ruby, którą instalujesz, RVMma swój własny GEM_HOME.

Ponadto fajnie jest, jeśli możesz uczynić swoje środowisko programistyczne jak najbliżej środowiska produkcyjnego, a w środowisku produkcyjnym najprawdopodobniej zainstalujesz klejnoty jako użytkownik inny niż root.

jonnii
źródło
12
+1 za rvm sugeruje, ale -1 za mylące potępienie alternatywnej możliwości używania po prostu sudo
tfwright
10
Ok, ale wszystkie twoje powody sprowadzają się do stwierdzenia „ponieważ RVM jest świetny”, a nie dlatego, że używanie sudo jest szczególnie szkodliwe. Jedyny przypadek, w którym nie chciałbyś, znajduje się w konkretnej sytuacji, gdy jesteś na wspólnym komputerze. Jeśli chcesz polecić rvm, zrób to. Nie ma potrzeby uciekania się do FUDD.
tfwright
6
Staram się nie rozpowszechniać FUD i starałem się podać powody inne niż RVM. Przepraszam, jeśli tak się wydaje.
jonnii
9
RVM to dobra opcja. Ale powinieneś spróbować lepszego, RBENV. Jest mniej inwazyjny niż RVM.
Andres
4
@ HontváriJózsefLevente Trudno jest odpowiedzieć na wszystkie pytania w komentarzu, ale krótko mówiąc, chcesz, aby środowisko programistyczne było jak najbliżej produkcji. Jeśli pracujesz nad dwiema aplikacjami, z których jedna używa Ruby 2.1, a druga użytkowników 1.9, musisz upewnić się, że twoje środowisko lokalne używa odpowiedniej wersji. to właśnie robi dla Ciebie RVM lub RBENV. Używałbyś go z tego samego powodu, dla którego używałbyś dowolnego środowiska piaskownicy, ale główną korzyścią w tym przypadku jest izolacja. Mam nadzieję, że to pomoże!
jonnii
128

Możesz także zainstalować klejnoty w swoim lokalnym środowisku (bez sudo) za pomocą

gem install --user-install <gemname>

Zalecam to, abyś nie bałaganił konfiguracji na poziomie systemu, nawet jeśli jest to komputer jednego użytkownika.

Możesz sprawdzić, gdzie trafiają klejnoty, patrząc na gempaty z gem environment. W moim przypadku jest to „~ / .gem / ruby ​​/ 1.8”.

Jeśli potrzebujesz dodać pliki binarne z lokalnych instalacji do swojej ścieżki, możesz dodać coś do swojego bashrc, na przykład:

if which ruby >/dev/null && which gem >/dev/null; then
    PATH="$(ruby -r rubygems -e 'puts Gem.user_dir')/bin:$PATH"
fi

(z http://guides.rubygems.org/faqs/#user-install )

Nils
źródło
23
+1 dla tej opcji zamiast rozwiązań „Yet Another Configuration Tool” powyżej, RBENV / RVM.
jjpe
rake installTworzę perełkę i zgodnie z instrukcjami, które muszę zrobić i naprawić sudo isse, musiałem ręcznie łatać /Library/Ruby/Gems/2.0.0/gems/bundler-1.7.3/lib/bundler/gem_helper.rbdodawanie --user-installtam. Nie mogę znaleźć lepszego rozwiązania, ponieważ wygląda na to, rake installże nie akceptuje dodatkowych parametrów.
Nakilon
Jestem absolutnie zachwycony tym pierwszym poleceniem. Próbowałem zainstalować klejnoty i mam problemy, ponieważ nie mam uprawnień do sudo. To polecenie zadziałało !!!!
Caleb Kleveter
34

Jeszcze lepiej, umieść --user-installswój plik ~ / .gemrc, abyś nie musiał go wpisywać za każdym razem

gem: --user-install
allyraza
źródło
13

W przypadku, gdy

  • zainstalowałem klejnoty ruby ​​z sudo
  • chcesz zainstalować klejnoty bez sudo
  • nie chcę instalować rvm / rbenv

dodaj do swojego .bash_profile:

export GEM_HOME=/Users/your_user›/.gem
export PATH="$GEM_HOME/bin:$PATH"

Otwórz nową kartę w Terminalu LUB source ~/.bash_profilei gotowe!

David Salamon
źródło
8
Dla kogoś, kto nie pracuje z Rubim, Railsami, Rake'iem i czymkolwiek innym deweloperzy Rubiego używają / chcą używać TO rozwiązanie jest o wiele łatwiejsze niż użycie rvm. Naprawdę nie obchodzi mnie posiadanie różnych wersji ruby. Chcę tylko uruchomić kilka programów powłoki dystrybuowanych jako klejnoty. Dziękuję Ci!
Kevin Gimbel,
9

Powiązane (dla użytkowników pakietów), jeśli potrzebujesz lżejszej alternatywy dla RVM, która umieści wszystko w dobrze znanym katalogu specyficznym dla użytkownika, polecam użycie:

bundle install --path $HOME/.gem

jeśli chcesz zainstalować klejnoty w tym samym miejscu

gem install --user-install GEMNAME

zainstaluje je .gem/ruby/RUBYVERSIONw Twoim katalogu domowym. (Zobacz inny komentarz do tego pytania --user-install).

Dzięki temu klejnoty będą widoczne gem list, niemożliwe do odinstalowania przez gem uninstallitd. Bez konieczności sudodostępu. Uruchomione skrypty zainstalowane przez gem lub bundler można umieścić na swojej ścieżce, dodając

$HOME/.gem/ruby/RUBYVERSION/bin

do twojego $PATH. gemsam mówi o tym, jeśli nie jest ustawiony, kiedy to robisz gem install --user-install.

Todd Vierling
źródło
Dzięki za to. Czy jest możliwe, aby bundler robił to domyślnie? (A jeśli tak, to czy byłby to dobry pomysł?)
joshtch
6
sudo gem install --no-user-install <gem-name>

zainstaluje twój klejnot globalnie , tzn. będzie dostępny dla wszystkich kontekstów użytkownika.

Tasos Koutoumanos
źródło
1
Może również nadpisać klejnot zainstalowany przez dostawcę, który może oczekiwać, że system operacyjny będzie ustawiony na określoną wersję. A to może złamać kod, który na tym polega.
Tin Man
1
... lub może zainstalować klejnot, którego dostawca nie zapewnia, i zrobić to w sposób, który udostępnia go wszystkim użytkownikom systemu. To lekko pogarsza że wszystkie odpowiedzi wszędzie zakładać czytelnika jest dev v / sa administrator, który faktycznie robi chcesz zrobić wersję konkretnego gem dostępnej dla wszystkich użytkowników. : D
dannysauer
1

Możesz zainstalować klejnoty w określonym folderze (przykład dostawcy /) w swojej aplikacji Rails, używając:

bundle install --path vendor
Chadi
źródło
To. Obecnie jedynym programem, który powinien wymagać sudo do zainstalowania oprogramowania, jest menedżer pakietów.
tjbp