Como especifico arquivos .gem locais no meu Gemfile?

158

Eu tenho alguns arquivos gem que eu instalo via gem install xx.gem. Posso dizer ao Bundler para usá-los? Ou tenho que especificar o caminho de origem?

ddayan
fonte
Relacionado: stackoverflow.com/questions/4487948/…
Ciro Santilli escreveu

Respostas:

282

Esta não é estritamente uma resposta à sua pergunta sobre a instalação de .gempacotes, mas você pode especificar todos os tipos de locais gem a gem editando seu Gemfile .

A especificação de um :pathatributo instalará a gema desse caminho na sua máquina local.

gem "foreman", path: "/Users/pje/my_foreman_fork"

Como alternativa, especificar um :gitatributo instalará a gem a partir de um repositório git remoto.

gem "foreman", git: "git://github.com/pje/foreman.git"

# ...or at a specific SHA-1 ref
gem "foreman", git: "git://github.com/pje/foreman.git", ref: "bf648a070c"

# ...or branch
gem "foreman", git: "git://github.com/pje/foreman.git", branch: "jruby"

# ...or tag
gem "foreman", git: "git://github.com/pje/foreman.git", tag: "v0.45.0"

(Como @JHurrah mencionou em seu comentário .)

pje
fonte
Também para alguns firewalls, o protocolo git pode ser um problema. Nesse caso, tentegem "foreman", :git => "https://github.com/pje/foreman.git"
kode 11/12/13
60

Parece que o empacotador não pode usar arquivos .gem imediatamente. Apontar o caminho: para um diretório que contém arquivos .gem não funciona. Algumas pessoas sugeriram configurar um servidor de gem local (geminabox, stickler) para esse fim.

No entanto, o que eu achei muito mais simples é usar um servidor "gem" local do sistema de arquivos: basta colocar seus arquivos .gem em um diretório local e, em seguida, usar "gem generate_index" para torná-lo um repositório Gem

mkdir repo
mkdir repo/gems
cp *.gem repo/gems
cd repo
gem generate_index

Finalmente, aponte o bundler para esse local adicionando a seguinte linha ao seu Gemfile

source "file://path/to/repo"

Se você atualizar as gemas no repositório, certifique-se de gerar novamente o índice.

Martin Thiede
fonte
6
Obrigado! Além disso, eu precisava de uma terceira barra para fazer "file: /// Absolute / Path / to / repo"
Anna
5
Não seria mais fácil executar o "gem server" na linha de comando e adicionar a fonte " localhost: 8808 " ao seu Gemfile
Anna
Isso é muito legal, Martin! Obrigado por compartilhar, é exatamente o que eu estava procurando, pois não queria depender da execução de um gem servernem queria hospedar todo o projeto, apenas o arquivo .gem.
Leo Gallucci
6
Dica de bônus: você pode contornar o requisito de caminho absoluto usando File.expand_path como estesource "file://#{File.expand_path('.')}/chef-11.10.0.dev.2"
Leo Gallucci
Não funciona para mim. Mac OS X. Bundler v1.11.2:Could not fetch specs from file://Users/nakilon/....../
Nakilon
43

Eu descompactaria sua gema na pasta do fornecedor do aplicativo

gem unpack your.gem --target /path_to_app/vendor/gems/

Em seguida, adicione o caminho no Gemfile para vincular a gema não compactada.

gem 'your', '2.0.1', :path => 'vendor/gems/your'
edap
fonte
29

Por padrão, o Bundler verifica primeiro o seu sistema e, se não conseguir encontrar uma jóia, utilizará as fontes especificadas no seu Gemfile.

JHurrah
fonte
Verdade. mas o que se eu não tiver instalado antes (quando estou implementando em um servidor) Não foi possível encontrar Imlib2-Rubi-0.5.2 em qualquer uma das fontes de comando acabado?
ddayan
184
você pode apontar para um diretório local com gema "gemname",: path => "~ / some / / local caminho"
JHurrah
5
Eu acho que: path requer a pasta gem com o arquivo gemspec. Eu só tenho arquivos .gem que desejo instalar.
ddayan
1
Ok, então o deploy do cap passou, mas a gema não foi instalada "Não existe esse arquivo para carregar - vips": /
ddayan 13/04/11
4
Definitivamente, isso não é verdade, pelo menos por mais tempo. O Bundler não olha para as gemas do seu sistema e apenas passa pelo que está no Gemfile. Uma das razões é tão terrível.
bioneuralnet
6

Você pode forçar o bundler a usar as gems implantadas usando "bundle package" e "bundle install --local"

Na sua máquina de desenvolvimento:

bundle install

(Instala gemas necessárias e cria Gemfile.lock)

bundle package

(Armazena em cache as gemas no fornecedor / cache)

No servidor:

bundle install --local

(--local significa "use as gemas do fornecedor / cache")

Henry Collingridge
fonte
E se eu não conseguir instalar nada no servidor? Nesse caso, eu preciso criar com rake, mas o servidor não tem uma gema que eu uso na construção; mas não tenho nenhum problema ao verificar as dependências.
Henrik
"bundle install" não funcionou para mim se a jóia não foi incluído na minha fonte existente Gemfile".
Anna
Basta remover o arquivo gem formar temporariamente o arquivo gem antes de fazer bundle installDepois disso, copie o Gemfile ao fornecedor / cache , adicione a volta gem ao Gemfile e executar bundle install --local
bert bruynooghe
1
bundle packageé uma ótima sugestão, mesmo agora, três anos depois. Se a sua versão do Bundler for anterior a 2.0 (ainda não lançada até o momento), você precisará usá- bundle package --alllo se desejar incluir gemas com pathou gitdependências. Ele fornecerá um lembrete útil se detectar tais dependências.
precisa
1
FYI: isso pode não funcionar tão bem quanto você esperaria se desenvolvesse em uma plataforma diferente da que implementa (por exemplo, desenvolva no macOS, implante no Linux). De acordo com a --localdocumentação: "Observe que, se uma jóia específica da plataforma apropriada existir no rubygems.org, ela não será encontrada."
Liam Dawson
1

Adicionando .gema vendor/cacheparece trabalho. Nenhuma opção é necessária no Gemfile.

Victor Moroz
fonte