2012-06-20 3 views
1

je tente de créer un simple heroku app qui clone un dépôt git, invoque bundle install, une tâche rake dist et télécharge ensuite les fichiers créés à un dépôt GitHub. La tâche de construction du référentiel cloné utilise Rake Pipeline, qui utilise la gemme execjs pour créer le binaire.Bundler.with_clean_env ne trouve pas JavaScript Runtime

J'ai créé un exemple d'application situé au https://github.com/pangratz/github-uploader-test, qui illustre le problème. La structure de répertoire de l'application est la suivante:

/upload.rb 
/project 
    Rakefile 
    Assetfile 
    Gemfile 
    Gemfile.lock 

L'application elle-même est un simple sinatra application avec une route get '/', qui ressemble à ceci:

upload.rb

get '/' do 
    Dir.chdir "project" do 
    Bundler.with_clean_env do 
     system "bundle install" 
     system "bundle exec rake dist" 
    end 
    end 
end 

À des fins de démonstration, le dossier project simule le référentiel git cloné. Il contient Rakefile, Assetfile, Gemfile et Gemfile.lock.

projet/Rakefile

desc "Build" 
task :dist do 
    Rake::Pipeline::Project.new("Assetfile").invoke 
end 

projet/Assetfile

require "rake-pipeline-web-filters" 
require "json" 
require "uglifier" 
require "execjs" 

puts ExecJS.eval "'red yellow blue'.split(' ')" 

projet/Gemfile

source "http://rubygems.org" 

gem "rake-pipeline", :git => "https://github.com/livingsocial/rake-pipeline.git" 
gem "rake-pipeline-web-filters", :git => "https://github.com/wycats/rake-pipeline-web-filters.git" 
gem "colored" 
gem "uglifier", :git => "https://github.com/lautis/uglifier.git" 

group :development do 
    gem "rack" 
    gem "rest-client" 
    gem "github_api" 
    gem "ember-docs", :git => "https://github.com/emberjs/docs-generator.git" 
    gem "kicker" 
end 

Le l'invocation de bundle install semble fonctionner. Le problème est que rake dist échoue avec l'erreur Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes..

L'application heroku elle-même est créée avec l'option --stack cedar.

J'ai également créé une route '/ test' qui utilise Execjs et cela n'échoue pas. Il semble donc qu'il ya un problème avec le Bundler.with_clean_env et ne trouvant pas le JavaScript Runtime est installé ...

upload.rb

get '/test' do 
    puts ExecJS.eval "'red yellow blue'.split(' ')" 
end 
+1

C'est drôle. Je peux le reproduire sur Heroku, mais pas localement. L'ajout de 'therubyracer' au projet/Gemfile le corrige, mais je ne sais pas pourquoi ExecJS trouve un runtime JS (Node I presume) dans le projet principal, mais pas dans le sous-projet. Si vous avez vraiment besoin de ce corrigé, je suggérerais de différencier la sortie de 'env' et les choses similaires entre le projet principal et le sous-projet. –

+0

Oui, ça marche aussi pour moi. Je vais essayer votre suggestion différant 'env' ... Merci. – pangratz

Répondre

0

J'ai ouvert un problème sur Heroku et j'ai pu résoudre le problème. Le problème était que le Dir.chdir("project") en combinaison avec le Bundler.with_clean_env résultait en un PATH non valide qui est nécessaire pour localiser le JavaScript Runtime. Longue histoire courte, voici la solution de travail:

get '/' do 
    Dir.chdir "project" do 
    Bundler.with_clean_env do 
     ENV["PATH"] = "/app/bin:#{ENV['PATH']}" 
     system "bundle install --without WATWAT" 
     system "bundle exec rake dist" 
    end 
    end 
end 

Une note sur la solution: le --without WATWAT est nécessaire parce que Heroku installe votre application avec bundle install --without development.Puisque le --without est mémorisé pour les appels successifs, et que les gemmes du groupe development sont nécessaires dans le Assetfile, cette option doit être écrasée. L'utilisation de --without '' ne fonctionne pas, donc j'utilise le groupe inexistant WATWAT pour inclure tous les groupes dans le Gemfile.

0

Vous pouvez également essayer de mettre ENV['BUNDLE_GEMFILE']=/path/to/project/Gemfile. Cela devrait garantir que install et exec trouvent le Gemfile correct.

+0

Est-ce différent de 'bundle install --gemfile/path/to/project/Gemfile'? – pangratz

+0

Pouvez-vous donner un exemple de code sur la façon dont j'utiliserais votre suggestion? Devrais-je conserver le 'Bundler.with_clean_env'? – pangratz