Como posso especificar uma jóia local no meu Gemfile?

359

Eu gostaria que Bundler carregasse uma jóia local. Existe uma opção para isso? Ou tenho que mover a pasta gem para o diretório .bundle?

picardo
fonte

Respostas:

541

Eu acredito que você pode fazer isso:

gem "foo", path: "/path/to/foo"
Jimmy Cuadra
fonte
10
Um caminho codificado é bom para uma sessão rápida de hack, mas a solução de gem local do bloudermilk é mais eficaz para projetos sob controle de versão. Ele permite que você faça check-in nos dois projetos - gem e projeto usando a gem - para que outras pessoas não precisem verificar a fonte da gem ou compartilhar os mesmos caminhos.
mahemoff
4
Você pode tornar isso um pouco mais limpo usando um link simbólico .gitignored para a gema local no diretório do projeto - dessa forma, você pode usar o controle de origem nos dois projetos separadamente e outros podem fazer o mesmo sem ter uma estrutura de diretórios idêntica.
Dan
7
Algo a se observar pode ser a primavera. Se você estiver usando um caminho local para a sua gema, poderá notar versões em cache da sua gema local, como eu fiz no console do Rails. Se não parecer que suas alterações de gemas locais estão sendo buscadas, tente spring stopver se é realmente esse o problema.
Jason R
11
Adicionar o caminho do gem local ao config / spring.rb parece ajudar a capturar as alterações do gem local após reiniciar o console / servidor do rails.
Jason R
5
Maneira muito melhor de fazê-lo aqui: rossta.net/blog/…
Cyzanfar 24/16
230

Além de especificar o caminho (como Jimmy mencionou), você também pode forçar o Bundler a usar uma gema local para o seu ambiente apenas usando a seguinte opção de configuração:

$ bundle config local.GEM_NAME /path/to/local/git/repository

Isso é extremamente útil se você estiver desenvolvendo duas gemas ou uma gema e um aplicativo de trilhos lado a lado.

Observe, porém, que isso só funciona quando você já está usando o git para sua dependência, por exemplo:

# In Gemfile
gem 'rack', :github => 'rack/rack', :branch => 'master'

# In your terminal
$ bundle config local.rack ~/Work/git/rack

Como visto nos documentos .

bloudermilk
fonte
Estou tendo problemas com isso porque estou usando BUNDLE_PATH(construindo um pacote para distribuição). Ao fazer o que você sugeriu, ou a resposta de Jimmy, ele faz apenas um usinge, na verdade, não é instalado na minha BUNDLE_PATHpasta. Não consegui descobrir isso, ajuda?
Automatico
2
Observe que isso não funcionará com um gemspec , por discussão aqui .
Davetapley
31
Para desativar a substituição local:bundle config --delete local.GEM_NAME
alxndr 29/11
Eu tive que remover a diretiva de versão da linha gem para fazer isso funcionar.
Epigene 27/01
4
Se você deseja usar uma ramificação diferente no desenvolvimento e na produção, também precisa definir bundle config disable_local_branch_check trueou o Bundler reclamará da ramificação. Porém, tenha cuidado com isso, pois as verificações devem impedir a entrada de confirmações incorretas Gemfile.lock. Documentos aqui: bundler.io/v1.12/git.html
Leo
33

Você também pode fazer referência a uma jóia local com o git se estiver trabalhando nela.

gem 'foo',
  :git => '/Path/to/local/git/repo',
  :branch => 'my-feature-branch'

Então, se mudar, eu corro

bundle exec gem uninstall foo
bundle update foo

Mas não tenho certeza se todos precisam executar essas duas etapas.

Rimian
fonte
5
isso é ótimo, mas não é tão conveniente se você está desenvolvendo ativamente a gema ... porque você vai precisar para cometer toda mudança e bundle uninstall <gem> && bundle install , para cada mudança que você quer refletiu sobre a sua aplicação
Ramses
18

Para usar o repositório de gemas local em um projeto Rails, siga as etapas abaixo:

  1. Verifique se sua pasta gem é um repositório git (o comando é executado na pasta gem)

    git rev-parse --is-inside-work-tree
  2. Obtendo o caminho do repositório (o comando é executado na pasta gem)

    git rev-parse --show-toplevel
  3. Configurando uma Substituição Local para o Aplicativo Rails

    bundle config local.GEM_NAME /path/to/local/git/repository

    onde GEM_NAMEé o nome da sua gema e /path/to/local/git/repositoryé a saída do comando no ponto2

  4. No seu aplicativo, Gemfileadicione a seguinte linha:

    gem 'GEM_NAME', :github => 'GEM_NAME/GEM_NAME', :branch => 'master'
  5. Correr bundle installdeve dar algo como isto:

    Using GEM_NAME (0.0.1) from git://github.com/GEM_NAME/GEM_NAME.git (at /path/to/local/git/repository) 

    onde GEM_NAMEé o nome da sua gema e /path/to/local/git/repositorydo ponto2

  6. Por fim, execute bundle list, não gem liste você deverá ver algo assim:

    GEM_NAME (0.0.1 5a68b88)

    onde GEM_NAMEestá o nome da sua gema


Alguns casos importantes que estou observando usando:

Rails 4.0.2  
ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-linux] 
Ubuntu 13.10  
RubyMine 6.0.3
  • Parece que RubyMinenão está mostrando gemas locais como uma biblioteca externa. Mais informações sobre o bug podem ser encontradas aqui e aqui
  • Quando estou alterando algo na gema local, para ser carregado no aplicativo de trilhos, devo stop/start o servidor rails
  • Se eu estiver alterando a versiongema, stopping/startingo servidor Rails me fornecerá um erro. Para corrigi-lo, estou especificando a versão gem no aplicativo de trilhos Gemfilecomo este:

    gem 'GEM_NAME', '0.0.2', :github => 'GEM_NAME/GEM_NAME', :branch => 'master'
gotqn
fonte
0

Você pode fazer referência a gemas com source: source: 'https://source.com', git repository (:github => 'git/url')e com local path :path => '.../path/gem_name'.
Você pode aprender mais sobre Gemfiles e como usá-los neste artigo.

Nesha Zoric
fonte
-4

Se você quiser o ramo também:

gem 'foo', path: "point/to/your/path", branch: "branch-name"
C Johnson
fonte
Isso não funciona, gera um erro: Only gems with a git source can specify a branch.
KenB