Bundler: Você está tentando instalar no modo de implantação após alterar seu Gemfile


86

Sou muito novo em bundler e capistrano, e estou tentando usá-los juntos. Quando tento implantar, recebo a mensagem:

Você está tentando instalar no modo de implantação após alterar seu Gemfile. Execute `bundle install 'em outro lugar e adicione o Gemfile.lock atualizado ao controle de versão.

Não sei como satisfazer o sistema que está reclamando, e não entendo por que a reclamação está surgindo porque li no documento :

Se um Gemfile.lock existe, e você atualizou seu Gemfile (5), o bundler usará as dependências no Gemfile.lock para todas as gemas que você não atualizou, mas irá resolver novamente as dependências das gemas que você atualizou . Você pode encontrar mais informações sobre esse processo de atualização abaixo em ATUALIZAÇÃO CONSERVATIVA.

Eu interpreto isso como significando que o Bundler pode lidar com o fato de que meu Gemfile não é o que ele esperava. Qualquer ajuda?

Especificações: Ruby 1.9.3, Rails 3.2.3, Capistrano 2.12.0, Bundler 1.1.4, Windows 7, implantando em uma máquina Posix.

Edit: My Gemfile inclui blocos lógicos como o seguinte:

unless RbConfig::CONFIG['host_os'] === 'mingw32'
  # gem 'a' ...
end

Respostas:


80

A mensagem de erro que você está recebendo Gemfile.lockpode ser porque vocês Gemfilee Gemfile.locknão concordam um com o outro. Parece que você mudou algo em seu Gemfile desde a última execução bundle install(ou update). Quando você bundle install, ele atualiza seu Gemfile.lock com todas as alterações feitas no Gemfile.

Certifique-se de executar bundle installlocalmente e faça check-in no controle de origem do seu recém-atualizado Gemfile.lockdepois disso. Em seguida, tente implantar.

Edit : conforme reconhecido nos comentários, uma condicional no Gemfile resultou em um Gemfile.lock válido em uma plataforma, inválido em outra. Fornecer um sinalizador : platform para essas gemas dependentes da plataforma no Gemfile deve resolver a assimetria.


2
Parece a resposta certa, mas executei o bundle install na minha máquina de desenvolvimento, verifiquei o Gemfile e seu bloqueio em svn e usei o capistrano. O problema pode ser porque o Gemfile inclui um bloco com unless RbConfig::CONFIG['host_os'] === 'mingw32':? (Logo, ele deve agrupar itens diferentes no meu computador Windows e no servidor Linux.)
JellicleCat

1
Bem possível. Verifique o conteúdo do seu Gemfile.lock - ele contém referências a gem (s) que só devem ser incluídas no Windows? Em caso afirmativo, isso sugere que, na máquina de implantação, Gemfile e Gemfile.lock são diferentes. (Além disso, não sou especialista em Bundler, mas tenho certeza de que colocar condicionais em seu Gemfile não é a melhor prática. Considere usar grupos ou o sinalizador: platform ).
Edd Morgan

2
Usar o :platformssinalizador para as gemas que meu servidor prod (posix) precisava, mas que não estavam em meu servidor dev (win) fez a diferença: platforms :ruby do; gem 'mygem'; ...; end(Você recebe a marca de seleção verde se não se importar em adicionar esta instrução à sua resposta.)
JellicleCat

: a plataforma não é capaz de distinguir entre linux e / ou darwin env usando :require, funciona bem também stackoverflow.com/a/16475580/933358
Daniël W. Crompton

Isso funcionou para mim! Obrigado, me salvou de mais dias de frustração!
thenextmogul

26

vi .bundle / config

mude a opção BUNDLE_FROZEN de '1' para '0'

faça "bundle install"


OU

execute "bundle config"

veja se o valor "congelado" é verdadeiro defina-o como falso

configuração do pacote congelada falsa


Isso é o que fez isso por mim. Curiosamente, no próprio arquivo de configuração, a chave BUNDLE_FROZEN não foi definida. É possível que eu tenha definido BUNDLE_FROZEN: 1 em outro lugar?
Bo G.

bundle config frozen falseé minha correção goto. Muito obrigado, dois anos depois! Acredito que a resposta de Joshua Pinter aborda o comentário acima - pode ser a configuração global do Bundler afetando isso.
SRack de

bundle config frozen falsenão fez nada por mim. Recorri à edição de .bundle / config em que a entrada BUNDLE_FROZEN = "true" (textual true)
Arthur

19

Cuidado com a configuração global do Bundler.

Eu tinha uma configuração global em meu ambiente de desenvolvimento ~/.bundle/configque não tinha em meu ambiente de CI / Produção, o que fazia com Gemfile.lockque o gerado em meu ambiente de desenvolvimento fosse diferente daquele em meu ambiente de CI / Produção.

No meu caso, eu estava definindo github.httpscomo true no meu ambiente de desenvolvimento, mas não tinha essa configuração no meu ambiente de CI / Produção. Isso fazia com que os dois Gemfile.lockarquivos fossem diferentes.


2
obrigado! de todas as respostas simples voando por aí relacionadas a esse erro ridículo - foi isso que me fez voltar ao trabalho. Por que diabos o Heroku não ajuda automaticamente com isso? Que razão esfarrapada para ter perdido as últimas 3 horas da minha vida!
demônio

2
Você pode apenas ter salvado minha vida. Eu estava me preparando para atirar em mim mesmo por causa disso: P
Tyrone Wilson

1
@JoshuaPinter, sim, isso me salvou! embora tenha gasto várias horas nisso ... mas eu estava tentando corrigir os avisos que recebia ao fazer a 'instalação do pacote' e fiquei preso neste pickle. Muito apreciado!
daveomcd

1
@daveomcd Estive lá, feliz por ter te poupado outras horas de coçar a cabeça. :)
Joshua Pinter

11

Quando você vê o seguinte ...

$ bundle install
You are trying to install in deployment mode after changing
your Gemfile. Run `bundle install` elsewhere and add the
updated Gemfile.lock to version control.

If this is a development machine, remove the Gemfile freeze
by running `bundle install --no-deployment`.

You have added to the Gemfile:
* source: rubygems repository https://rubygems.org/
* rails (~> 3.2)
. . .

... Então, o problema é mais provável que você tenha arquivos .gem desatualizados em seu diretório vendor / cache.

Talvez você tenha executado anteriormente o $bundle install --deploymentque colocou alguns arquivos .gem "desatualizados" no cache?

Em qualquer caso, você pode superar esse erro executando: bundle install --no-deployment

Essa é uma das muitas coisas boas sobre Rails ... as mensagens de erro geralmente dizem a você exatamente o que fazer para corrigir o problema.


7

Meu problema específico estava relacionado ao que foi relatado por @JoshPinter, ou seja, discrepâncias de host dev-vs-deploy no protocolo usado pelo bundler para recuperar joias do github.

Para encurtar a história, tudo o que tive que fazer foi modificar a seguinte Gemfileentrada ...

gem 'activeadmin', github: 'activeadmin'

... para esta sintaxe segura ( consulte a referência ):

gem 'activeadmin', git: 'https://github.com/activeadmin/activeadmin.git'

E minhas implantações voltaram ao normal.


Isso também resolveu o problema para mim. Realmente estranho.
Joshua Muheim

6

A solução para mim foi um pouco diferente das outras listadas aqui. Eu estava tentando atualizar do sidekiq para o sidekiq-pro (que requer bundler 1.7.12+), mas continuei recebendo a mensagem "Você está tentando instalar no modo de implantação após alterar seu Gemfile" do travis-ci

A inspeção da saída do console do travis-ci revelou que uma versão mais antiga do bundler estava sendo usada.

No meu caso, tive que editar o arquivo travis.yml para adicionar:

before_install: - gem update bundler

Isso forçou travis-ci a usar a versão mais recente do bundler e fez com que a mensagem de erro desaparecesse.


Isso funcionou para mim sob o comando de Capistrano executar cap shelle gem update bundlerou with <role> gem update bundlerouon <machine> gem update bundler
Eric

4

Eu não me importo. Isso é o que eu fiz. Ele consertou.

rm -rf .bundle 
rm -rf Gemfile.lock
bundle install


1

Já encontrei algo semelhante antes. Uma maneira de consertar, eu acho, mas pode ocupar mais espaço em seu servidor do que você deseja, é executar

bundle install --deployment 

e tente implantar. Isso faz algo como instalar todas as suas joias na pasta vendor, o que eu acredito que geralmente é bom evitar ... mas provavelmente ainda funcionará. Meu aplicativo costumava se comportar assim, minha solução era remover as versões exatas para baixar do meu Gemfile e, em seguida, agrupar novamente e implantar.

gem 'rails_admin', :git => 'git://github.com/sferik/rails_admin.git', :branch => 'master'

para

gem 'rails_admin'

Ou você pode fazer o que ele sugere e enviar seu projeto do servidor de produção para uma máquina local, empacotá-lo e, em seguida, colocá-lo novamente no servidor. Esta solução pode não ser 100% correta, mas algumas delas funcionaram para mim ... apenas pensei em compartilhar. Boa sorte


1
O --deploymentsinalizador não fazia diferença, a menos que eu excluía o Gemfile.lock. É assim que deveria ser?
JellicleCat

1

Outra causa do erro:

Isso é um pouco tolo, mas tenho certeza de que outra pessoa cometerá o mesmo erro.

Para Rails 4, Heroku adicionou o gem rails_12factor. Se você estava usando antes de adicioná-lo, você terá estas duas joias:

gem 'rails_log_stdout',  github: 'heroku/rails_log_stdout'
gem 'rails3_serve_static_assets', github: 'heroku/rails3_serve_static_assets'

Você deve removê-los ao adicionar um novo. (eles estão incluídos). Acho que você pode se safar até tocar nas linhas do seu arquivo de gemas, então o Heroku percebe a duplicação e grita com o erro acima.

boa sorte com Rails 4.


1

Em nosso caso, estávamos usando um recurso que não estava disponível em uma versão antiga do bundler que rodava em nossa máquina de produção. Portanto, bastou atualizar o bundler, ou seja, fazer um gem update bundler.


Obrigado - eu também tive esse problema. Descobrimos que a versão do bundler no servidor era mais antiga do que a que estávamos usando em nossos desktops.
Nathan Bertram

1

Isso pode ser uma ideia perigosa, mas se for absolutamente necessário testar algo em um ambiente de implantação de produção, você pode editar o arquivo .bundle / config

# This value is normally '1' 
# Set it to '0'
BUNDLE_FROZEN: '0'

Agora invoque bundle, no meu caso, eu precisava atualizar uma gema específica, então este é o meu comando

RAILS_ENV=production bundle update <whatever gem>

Você provavelmente deve alterá-lo de volta após a atualização, para que as coisas funcionem como o esperado depois. Novamente, isso provavelmente não é compatível e YMMV


0

Corri para implantar um aplicativo Nesta depois de algumas atualizações de gem. O que funcionou para mim foi excluir o Gemfile.lock , executar bundle installpara gerá-lo novamente e implantar novamente.


0

Eu tive um problema semelhante, mas fiz ambos bundle installebundle update e Heroku ainda rejeitou o meu impulso.

Corrigi o problema apenas excluindo Gemfile.lock e executando bundle installnovamente. Em seguida, adicionei, cometi e enviei para meu repositório git. Depois disso, não tive nenhum problema em empurrar para Heroku.


A menos que você tenha corrigido suas versões de gem em seu gemfile, isso é arriscado .. pode atualizar gems e quebrar seu aplicativo
Abrão

0

para heroku, você não precisa alterar a sintaxe no Gemfile. você pode apenas adicionar BUNDLE_GITHUB__HTTPS(observe o sublinhado duplo) como uma variável de ambiente e defini-la como true(no painel do aplicativo heroku na Settingsguia da Config Varsseção). isso mudará o protocolo de git://para https://para todas essas solicitações.


0

Recebi a mensagem de erro ao tentar enviar para o Heroku. Eu encontrei a seguinte solução corrigida.

  1. Git pull origin master
  2. Status do Git
  3. Git commit
  4. Git push origin master
  5. Git push heroku mestre

0

Esse problema pode estar relacionado a submódulos que apontam para versões antigas do código. Para mim, resolvi esse problema atualizando meus submódulos

Se você tiver submódulos, tente executar:

git submodule update --init

bundle install


0

Após este comando, você pode fazer a instalação normal do pacote novamente:

bundle install --no-deployment

0

Eu li uma dúzia de soluções em diferentes recursos, mas não encontrei exatamente o que poderia me ajudar nesta situação

Então, encontrei uma solução. Exatamente dizendo que li a mensagem de erro com atenção e que havia uma solução: execute a instalação do pacote em outro lugar . "Elsewhere" foi minha Cloud9, onde desenvolvi meu aplicativo. Então meus passos

  1. copie Gemfile e Gemfile.lock do servidor para a máquina local com rsync comando
  2. inserir esses dois arquivos em meu projeto RoR (usei Cloud9)
  3. abra o Gemfile e faça as alterações que eu quiser. No meu caso eu adicionei gem 'fino'
  4. no cd do terminal para o meu aplicativo na Cloud9 e execute bundle install. neste caso, você terá uma mudança versão de Gemfile.lock
  5. copiar novo Gemfile e Gemfile.lock no servidor usandorsync
  6. cd para a pasta do meu aplicativo e execute novamente bundle install --deployment --without development test DONE! Deseje BOA sorte para todos!
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.