O que bundle exec rake db:migrate
significa isso ? Ou apenasbundle exec rake <command>
em geral?
Entendo que bundle
cuida de manter as coisas no Gemfile. Eu sei o que a palavra "exec" significa. Entendo que rake
mantém todas as diferentes coisas de script que você pode fazer e sei que db:migrate
é uma delas. Só não sei o que todas essas palavras estão fazendo juntas. Por que deve bundle
ser usado rake
para executar uma migração de banco de dados?
fonte
bundle
é o comando usado pelo Bundler..ruby-gemset
arquivo na raiz do projeto. Há também um.ruby-version
arquivo que define sua versão ruby se estiver usando o RVM.Você está executando
bundle exec
um programa. Os criadores do programa o escreveram quando certas versões de gemas estavam disponíveis. O programa Gemfile especifica as versões das gemas que os criadores decidiram usar. Ou seja, o script foi feito para ser executado corretamente nessas versões de gemas.O seu Gemfile em todo o sistema pode diferir deste Gemfile. Você pode ter joias mais novas ou mais antigas, com as quais esse script não funciona bem. Essa diferença de versão pode gerar erros estranhos.
bundle exec
ajuda a evitar esses erros. Ele executa o script usando as gemas especificadas no Gemfile do script, em vez do Gemfile em todo o sistema. Ele executa certas versões de gemas com a magia de aliases de shell.Veja mais na página do manual .
Aqui está um exemplo do Gemfile:
Aqui, você
bundle exec
executaria o script usando o rails versão 2.8.3 e não outra versão que você possa ter instalado em todo o sistema.fonte
rake db:migrate
saiu deixando de forabundle exec
, ela seria executada usando um Gemfile em todo o sistema em que alguém pode ter um rack em 1.5.2 (mais recente)?bundle exec
use as gemas locais "específicas do aplicativo" no seu Gemfile do seu aplicativo ebundle
use as gemas globais "específicas da máquina", se você o fezgem install a_certain_gem
. local vs globalIsso ocorre muito quando seu gemfile.lock possui versões diferentes das gemas instaladas em sua máquina. Você pode receber um aviso após executar o rake (ou rspec ou outros), como:
You have already activated rake 10.3.1, but your Gemfile requires rake 10.1.0. Prepending "bundle exec" to your command may solve this.
A adição antecipada
bundle exec
informa ao bundler para executar este comando, independentemente do diferencial de versão. Nem sempre há um problema; no entanto, você pode ter problemas.Felizmente, existe uma jóia que resolve isso: rubygems-bundler.
$ gem install rubygems-bundler
$ $ gem regenerate_binstubs
Em seguida, tente seu rake, rspec ou qualquer outra coisa.
fonte
Provavelmente, deve-se mencionar que existem maneiras de omitir
bundle exec
(todas elas são indicadas no capítulo 3.6.1 do livro Tutorial de Michael Hartls Ruby on Rails ).O mais simples é usar apenas uma versão suficientemente atualizada do RVM (> = 1.11.x).
Se você está restrito a uma versão anterior do RVM, sempre pode usar este método também mencionado por calasyr :
O
bundler_stubs
diretório também deve ser adicionado ao.gitignore
arquivo.Uma terceira opção é usar a
rubygems-bundler
gema se você não estiver usando o RVM:fonte
Quando você executa diretamente a tarefa rake ou executa qualquer arquivo binário de uma gema, não há garantia de que o comando se comporte conforme o esperado. Porque pode acontecer que você já tenha a mesma gema instalada em seu sistema, com uma versão say 1.0, mas no seu projeto você tenha uma versão superior say 2.0. Nesse caso, você não pode prever qual será usado.
Para impor a versão desejada da gema, você precisa da ajuda do
bundle exec
comando que executaria o binário no contexto do pacote atual. Isso significa que, quando você usa o bundle exec, o bundler verifica a versão da gem configurada para o projeto atual e a usa para executar a tarefa.Também escrevi um post sobre isso, que também mostra como podemos evitar usá-lo usando stubs de bin.
fonte
Não usei
bundle exec
muito, mas estou configurando agora.Eu tive casos em que o rake errado foi usado e perdi muito tempo rastreando o problema. Isso ajuda a evitar isso.
Veja como configurar o RVM para que você possa usar
bundle exec
por padrão em um diretório de projeto específico:https://thoughtbot.com/blog/use-bundlers-binstubs
fonte
Significa usar rake de que o bundler está ciente e faz parte do seu Gemfile sobre qualquer rake de que o bundler não está ciente e executar a tarefa db: migrate.
fonte