'sudo gem install' ou 'gem install' e localizações das gemas

140

A execução de ' sudo gem list --local' e ' gem list --local' fornece resultados diferentes. Meu caminho de gema está definido para minha pasta pessoal e contém apenas as gemas de ' gem list --local'.

Provavelmente não é bom ter gemas instaladas em diretórios diferentes no meu computador, por isso devo definir o caminho da gema de maneira diferente e sempre devo usar sudoao instalar alguma coisa?

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 está vazio.

raphael_turtle
fonte
1
Eu acho que essa é uma pergunta válida para aqueles que precisam usar uma gema que requer privilégios de root.
21411 Kelly
Relacionado: stackoverflow.com/questions/21141584/… . Eu uso o rbenv para gerenciar versões do Ruby e tive um problema porque usei em sudo gem install railsvez de gem install rails.
Dennis
3
"Acho que essa é uma pergunta válida para aqueles que precisam usar uma gema que requer privilégios de root". Eu acho que qualquer gema que precise de privilégios de root, seja para ser instalada ou executada, é altamente suspeita. As gemas devem poder executar em uma sandbox e executar com as permissões do usuário.
the Tin Man
1
sudoé uma arma carregada apontada para o seu pé. Usá-lo sem entender o que faz e como pode afetar seu sistema é como apertar o gatilho com os olhos fechados. Você pode abrir um buraco no pé, mas não quer correr o risco, a menos que saiba como desfazer o dano. O uso de sudogravações no Ruby, de propriedade do sistema, que, no Mac OS, foi instalado pela Apple para uso próprio. Podemos pegar carona, mas mudar a coisa errada pode quebrar o código deles. É por isso que instalamos a partir da fonte ou usamos outra coisa para instalar onde podemos ajustá-lo com segurança.
the Tin Man

Respostas:

146

Ao contrário de todos os outros posts, sugiro NÃO usar sudoao instalar gemas.

Em vez disso, recomendo que você instale o RVM e comece uma vida feliz com casas de jóias portáteis e uma versão diferente do Ruby, todas vivendo sob o mesmo teto.

Para os não iniciados, a partir da documentação :

O RVM é uma ferramenta de linha de comando que nos permite instalar, gerenciar e trabalhar com facilidade em vários ambientes ruby ​​e conjuntos de gemas.

A razão pela qual a instalação de gemas sudoé pior do que apenas gem installé porque instala as gemas para TODOS OS USUÁRIOS como root. Isso pode ser bom se você for a única pessoa a usar a máquina, mas se não for, poderá causar estranheza.

Se você decidir eliminar todas as suas jóias e começar de novo, é muito mais fácil e seguro fazê-lo como um usuário não root.

Se você decidir usar RVM, o uso sudocausará todo tipo de estranheza, porque cada versão do Ruby que você instala RVMpossui seu próprio GEM_HOME.

Além disso, é bom se você puder tornar seu ambiente de desenvolvimento o mais próximo possível do ambiente de produção e, na produção, você provavelmente instalará gems como um usuário não raiz.

Jonnii
fonte
12
+1 para o rvm sugere, mas -1 para a condenação confusa da possibilidade alternativa de usar apenas sudo
tfwright
10
Ok, mas todos os seus motivos se resumem a "porque o RVM é ótimo", não porque o uso do sudo é especialmente prejudicial. O único momento em que você não gostaria é na situação específica em que está em um computador compartilhado. Se você deseja recomendar o rvm, faça isso. Não há necessidade de recorrer ao FUDD.
precisa saber é o seguinte
6
Eu tento não espalhar o FUD, e tentei dar razões que não sejam do RVM, peço desculpas se parecer assim.
jonnii
9
RVM é uma boa opção. Mas você deve tentar uma melhor, RBENV. É menos invasivo que o RVM.
Andres
4
@ HontváriJózsefLevente é difícil abordar todas as suas perguntas em um comentário, mas o mais curto é que você deseja que seu ambiente de desenvolvimento seja o mais próximo possível da produção. se você estiver trabalhando em dois aplicativos, um dos quais usa o ruby ​​2.1 e o outro que os usuários 1.9, será necessário verificar se o ambiente local está usando a versão correta. é isso que RVM ou RBENV faz por você. Você o usaria pelo mesmo motivo que usaria qualquer ambiente de sandbox, mas o principal benefício nesse caso é o isolamento. Eu espero que isso ajude!
precisa
128

Você também pode instalar gemas em seu ambiente local (sem sudo) com

gem install --user-install <gemname>

Eu recomendo que você não mexa com sua configuração no nível do sistema, mesmo que seja um computador de usuário único.

Você pode verificar para onde estão as jóias, olhando para os caminhos de pedras preciosas gem environment. No meu caso, é "~ / .gem / ruby ​​/ 1.8".

Se você precisar adicionar alguns binários de instalações locais ao seu caminho, poderá adicionar algo ao seu bashrc, como:

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

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

Nils
fonte
23
+1 para esta opção em vez das soluções "Yet Another Configuration Tool" acima, RBENV / RVM.
Jjpe
Estou criando uma gema e de acordo com os manuais que tenho que fazer rake installe para consertar o sudo isse, tive que corrigir manualmente a /Library/Ruby/Gems/2.0.0/gems/bundler-1.7.3/lib/bundler/gem_helper.rbadição --user-installlá. Não foi possível encontrar uma solução melhor, porque parece rake installque não aceita parâmetros adicionais.
Nakilon
Estou absolutamente emocionado com esse primeiro comando. Eu tenho tentado instalar gemas e estou tendo problemas porque não tenho privilégios de sudo. Esse comando funcionou !!!!
Caleb Kleveter
34

Melhor ainda, coloque --user-installseu arquivo ~ / .gemrc para que você não precise digitá-lo toda vez

gem: --user-install
allyraza
fonte
13

No caso de você

  • gemas ruby ​​instaladas com sudo
  • quer instalar gemas sem sudo
  • não deseja instalar rvm / rbenv

adicione o seguinte ao seu .bash_profile:

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

Abra uma nova guia no Terminal OU source ~/.bash_profilee pronto!

David Salamon
fonte
8
Para alguém que não trabalha com Ruby, Rails, Rake e qualquer outra coisa que o Ruby Devs use / queira usar, esta solução é muito mais fácil do que usar o rvm. Eu realmente não me importo em ter diferentes versões de ruby. Eu só quero executar alguns programas shell distribuídos como gemas. Obrigado!
Kevin Gimbel
9

Relacionado (para usuários do bundler), se você deseja uma alternativa mais leve ao RVM, que colocará tudo em um diretório conhecido específico do usuário, recomendo usar:

bundle install --path $HOME/.gem

se você deseja instalar gemas no mesmo local que

gem install --user-install GEMNAME

irá instalá-los, .gem/ruby/RUBYVERSIONem sua casa. (Veja o outro comentário sobre esta questão sobre--user-install .)

Isso tornará as gemas visíveis gem list, desinstaláveis ​​via gem uninstalletc., sem a necessidade de sudoacesso. Os scripts executáveis ​​instalados por gem ou bundler podem ser colocados no seu caminho adicionando

$HOME/.gem/ruby/RUBYVERSION/bin

para o seu $PATH. gemele mesmo informa sobre isso se não estiver definido quando você o fizer gem install --user-install.

Todd Vierling
fonte
Obrigado por isso. É possível fazer o empacotador fazer isso por padrão? (E se assim for, seria uma boa idéia?)
joshtch
6
sudo gem install --no-user-install <gem-name>

instalará sua joia globalmente , ou seja, estará disponível para todos os contextos do usuário.

Tasos Koutoumanos
fonte
1
Ele também pode substituir uma gema instalada pelo fornecedor, que esse sistema operacional pode esperar ser definido para uma versão específica. E isso pode quebrar o código que depende dele.
the Tin Man
1
... ou pode instalar uma jóia que um fornecedor não fornece e fazê-lo de uma maneira que a torne disponível para todos os usuários em um sistema. É levemente agravante de que todas as respostas em todos os lugares presumem que o leitor é um dev v / sa sysadmin que realmente faz querer fazer uma versão específica de uma jóia disponível para todos os usuários. : D
dannysauer 19/04/19
1

Você pode instalar gemas em uma pasta específica (exemplo de fornecedor /) no seu aplicativo Rails usando:

bundle install --path vendor
Chadi
fonte
Este. Atualmente, o único programa que precisa do sudo para instalar o software é o seu gerenciador de pacotes.
Tjbp 22/07/19