Open tlluiz opened 11 years ago
Na verdade o erro acontece no Unicorn e a aplicação para de funcionar:
/shared/bundle/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:228:in `require': cannot load such file -- moip (LoadError)
/shared/bundle/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:228:in `block in require'
/shared/bundle/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:213:in `load_dependency'
/shared/bundle/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:228:in `require'
/releases/20130716120224/config/initializers/moip_assinaturas.rb:1:in `<top (required)>'
No initializer está assim:
require 'moip'
require 'moip/configuration'
Moip.configure do |config|
config.token = "meu_token"
config.acount_key = "minha_chave"
end
Gemfile:
gem 'api-moip-assinaturas', git: 'git://github.com/xdougx/api-moip-assinaturas.git', require: 'moip'
Ngix e Unicorn, eu uso unicorn no Heroku támbem e não tive esse problema, vou tentar reproduzir esse erro tentando usar dentro do controller a função, mas acho muito estranho esse de require. Eu venho desenvolvendo dentro do model as minhas funcionalidades. Vou tentar aqui reproduzir esse erro.
Em seu gemfile o gem 'api-moip-assinaturas'...
ele está fora de grupos correto?
Eu subi um teste igual o seu e tive sucesso em imprimir os conteúdos.
Faz um teste, tenta criar uma função dentro de um model, por exemplo Plan.
class Plans
def self.teste
puts @plan = Moip::Plan.new
puts @plan.load
puts @plan.plans
end
end
Tenta usar a função dentro do controller
def index
Plans.teste
end
Aproveita e faz um bundle update, eu fiz algumas pequenas alteração támbem.
Sim! No Gemfile está fora de qualquer grupo. O que é mais estranho é que rodando unicorn localmente também funciona perfeitamente.
Vou tentar colocar dentro de um model como você sugeriu. Estava usando dessa forma, mas mudei por achar desnecessário. Depois posto os resultados. (Aproveito para dar o bundle update)
Desde já agradeço a ajuda.
Ainda sem sucesso!
Criei um model chamado "Plans":
class Plans
def self.list
plan = Moip::Plan.new
plan.load
plan.plans
end
def self.new
Moip::Plan.new
end
def self.build(params)
Moip::Plan.build params
end
def self.activate(id)
plan = Moip::Plan.new
plan.find id
plan.activate
end
def self.inactivate(id)
plan = Moip::Plan.new
plan.find id
plan.inactivate
end
def self.show(id)
plan = Moip::Plan.new
plan.find id
plan
end
end
E no controller "PlanController" ficou assim:
class PlansController < ApplicationController
layout 'admin'
def index
@plans = Plans.list
end
def new
@plan = Plans.new
end
def show
@plan = Plans.show params[:id]
end
def create
@plan = Plans.build plan_params
if @plan.create
redirect_to plans_path, notice: "Plano criado com sucesso!"
else
redirect_to plans_path, alert: "#{Exception.new plan.errors.full_messages.first}"
end
end
def activate
if Plans.activate params[:id]
redirect_to plans_path, notice: "Plano ativado com sucesso!"
else
redirect_to plans_path, alert: "Não foi possível ativar este plano."
end
end
def deactivate
if Plans.inactivate params[:id]
redirect_to plans_path, notice: "Plano desativado com sucesso!"
else
redirect_to plans_path, alert: "Não foi possível desativar este plano."
end
end
private
def plan_params
params.require(:plan).permit(:code, :name, :description, :amount, :setup_fee, :max_qty, :length, :unit, :interval, :billing_cycles, :status)
end
end
Localmente tudo funciona, mas depois de dar deploy usando capistrano o erro do Unicorn é:
/shared/bundle/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:228:in `require': cannot load such file -- moip (LoadError)
/shared/bundle/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:228:in `block in require'
/shared/bundle/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:213:in `load_dependency'
/shared/bundle/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:228:in `require'
/releases/20130718161905/config/initializers/moip_assinaturas.rb:1:in `<top (required)>'
O que percebo é que me parece algum problema com a linha do initializer que chama o módulo da gem:
require 'moip'
require 'moip/configuration'
Moip.configure do |config|
config.token = "meu_token"
config.acount_key = "minha_chave"
end
Tem o backtrace completo do erro?
Tenho sim:
/home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:228:in `require': cannot load such file -- moip (LoadError)
from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:228:in `block in require'
from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:213:in `load_dependency'
from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:228:in `require'
from /home/deployer/apps/nome_do_projeto/releases/20130718161905/config/initializers/moip_assinaturas.rb:1:in `<top (required)>'
from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:222:in `load'
from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:222:in `block in load'
from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:213:in `load_dependency'
from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:222:in `load'
from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/railties-4.0.0/lib/rails/engine.rb:609:in `block (2 levels) in <class:Engine>'
from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/railties-4.0.0/lib/rails/engine.rb:608:in `each'
from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/railties-4.0.0/lib/rails/engine.rb:608:in `block in <class:Engine>'
from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/railties-4.0.0/lib/rails/initializable.rb:30:in `instance_exec'
from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/railties-4.0.0/lib/rails/initializable.rb:30:in `run'
from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/railties-4.0.0/lib/rails/initializable.rb:55:in `block in run_initializers'
from /home/deployer/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/tsort.rb:150:in `block in tsort_each'
from /home/deployer/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/tsort.rb:183:in `block (2 levels) in each_strongly_connected_component'
from /home/deployer/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/tsort.rb:210:in `block (2 levels) in each_strongly_connected_component_from'
from /home/deployer/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/tsort.rb:219:in `each_strongly_connected_component_from'
from /home/deployer/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/tsort.rb:209:in `block in each_strongly_connected_component_from'
from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/railties-4.0.0/lib/rails/initializable.rb:44:in `each'
from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/railties-4.0.0/lib/rails/initializable.rb:44:in `tsort_each_child'
from /home/deployer/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/tsort.rb:203:in `each_strongly_connected_component_from'
from /home/deployer/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/tsort.rb:182:in `block in each_strongly_connected_component'
from /home/deployer/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/tsort.rb:180:in `each'
from /home/deployer/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/tsort.rb:180:in `each_strongly_connected_component'
from /home/deployer/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/tsort.rb:148:in `tsort_each'
from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/railties-4.0.0/lib/rails/initializable.rb:54:in `run_initializers'
from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/railties-4.0.0/lib/rails/application.rb:215:in `initialize!'
from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/railties-4.0.0/lib/rails/railtie/configurable.rb:30:in `method_missing'
from /home/deployer/apps/nome_do_projeto/releases/20130718161905/config/environment.rb:6:in `<top (required)>'
from config.ru:4:in `require'
from config.ru:4:in `block in <main>'
from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/builder.rb:55:in `instance_eval'
from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/builder.rb:55:in `initialize'
from config.ru:1:in `new'
from config.ru:1:in `<main>'
from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/unicorn-4.6.2/lib/unicorn.rb:44:in `eval'
from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/unicorn-4.6.2/lib/unicorn.rb:44:in `block in builder'
from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/unicorn-4.6.2/lib/unicorn/http_server.rb:722:in `call'
from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/unicorn-4.6.2/lib/unicorn/http_server.rb:722:in `build_app!'
from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/unicorn-4.6.2/lib/unicorn/http_server.rb:595:in `init_worker_process'
from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/unicorn-4.6.2/lib/unicorn/http_server.rb:615:in `worker_loop'
from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/unicorn-4.6.2/lib/unicorn/http_server.rb:500:in `spawn_missing_workers'
from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/unicorn-4.6.2/lib/unicorn/http_server.rb:511:in `maintain_worker_count'
from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/unicorn-4.6.2/lib/unicorn/http_server.rb:277:in `join'
from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/gems/unicorn-4.6.2/bin/unicorn:126:in `<top (required)>'
from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/bin/unicorn:23:in `load'
from /home/deployer/apps/nome_do_projeto/shared/bundle/ruby/2.0.0/bin/unicorn:23:in `<main>'
E, [2013-07-18T17:21:55.334749 #23115] ERROR -- : reaped #<Process::Status: pid 28716 exit 1> worker=0
I, [2013-07-18T17:21:55.335036 #23115] INFO -- : worker=0 spawning...
I, [2013-07-18T17:21:55.343780 #29935] INFO -- : worker=0 spawned pid=29935
I, [2013-07-18T17:21:55.344178 #29935] INFO -- : Refreshing Gem list
O erro diz que quando ele vai fazer o require no initializer ele não encontra o arquivo moip.rb. será que a gem está realmente instalando dentro do server? tem como ver se a gem está instalada? por que eu não tenho idéia do que pode estar acontecendo dentro do seu server, pois eu uso o Heroku, com unicorn e eu sei que o heroku támbem usa ngix, mas isso não tem nada a ver.
Pois é! Um pouco bizarro.
Estou fazendo mais um teste aqui, pois vejo o capistrano executando o bundle install no servidor.
Mais uma vez agradeço pela ajuda.
Volto com novidades.
Blz, fico no aguardo!
Douglas,
O pior é que a gem está lá! Instalada perfeitamente.
O pior é que antes eu tinha usado a gem moip-assinaturas, que tem menos recursos, mas também hora que subiu para o servidor tive o mesmo problema.
Muito estranho. :(
Chegou a usar essa gem com rails 4?
ainda não usei com o rails 4, mas eu uso o ActiveSuport 4, então não deveria ter esse problema, a gem do moip-assinaturas ainda está instalada?
Está, mas não incluída no Gemfile. Será esse o problema?
Acabei de desinstalar, mas o cenário não mudou.
Faz um teste no servidor, consegue abrir um Irb e tenta carregar manualmente o gem para ver o que acontece.
Douglas primeiramente tentei rodar o IRB usando bundle exec irb
de dentro da pasta do projeto no servidor e ao tentar carregar a gem com require 'moip'
deu erro como estava dando no unicorn. Isso era o esperado, pois conseguir carregar a gem dentro do projeto manualmente ia ser muito incoerente.
Fui procurar o comando que o capistrano executa no servidor para instalar as gems:
bundle install --path /home/deployer/apps/nome_do_projeto/shared/bundle
Isso instala as gems em um path diferente do esperado para a maioria das gems, mesmo que eu esteja usando rbenv.
Depois das descobertas instalei a gem api-moip-assinaturas
usando gem install api-moip-assinaturas
, porém fora da pasta do projeto. O que provocou a instalação da gem e todas as suas dependências dentro do path padrão do rbenv.
Executando o IRB sem o bundle exec
e fora da pasta do projeto consegui carregar a gem, porém dentro da pasta do projeto com bundle exec
não carrega.
Agora me corrija se estiver falando alguma besteira, mas não parece que será necessário adicionar alguma dependência do bundler na gem api-moip-assinaturas
? Pois assim o bundler vai achar a gem instalada dentro do path do projeto e carregá-la corretamente?
Se você olhar o gemspec do api-moip-assinaturas, vai ver que ele tem as dependencias declaradas:
s.add_development_dependency 'httparty', '~> 0.11.0', '>= 0.11.0'
s.add_development_dependency 'json', '~> 1.7.7', '>= 1.7.7'
s.add_development_dependency 'activemodel', '~> 3.2.12', '>= 3.2.12'
s.add_development_dependency 'i18n', '~> 0.6.1', '>= 0.6.1'
s.add_dependency 'httparty', '>= 0.11.0'
s.add_dependency 'json', '>= 1.7.7'
s.add_dependency 'activemodel', '>= 3.2.12'
s.add_dependency 'i18n', '~> 0.6.1', '>= 0.6.1'
Acho que consegui resolver.
O que foi feito?
Sou novato nessa história de contribuição a outros projetos, mas basicamente o que eu fiz foi criar um arquivo Rakefile
com o carregamento do bundle/gem_tasks
e mudar a forma como a gem busca o path dos arquivos no gemspec
. Dei um pull request na gem. Desde já peço desculpa caso tenha feito alguma besteira, mas foi a forma que consegui resolver o problema. Caso tenha feito de forma errada por favor me oriente, ok?
Olá! Estou usando a gem com ruby 2.0 e rails 4.0 e localmente tudo funciona perfeitamente, porém quando coloco em produção com Unicorn e Nginx recebo a seguinte mensagem de erro:
O código que gera o erro em produção:
Será que podem me ajudar?
Desde já agradeço a atenção.