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
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. –
Oui, ça marche aussi pour moi. Je vais essayer votre suggestion différant 'env' ... Merci. – pangratz