Bundler.with_clean_env找不到JavaScript运行时

时间:2012-06-20 07:50:31

标签: heroku bundler

我尝试创建一个简单的 heroku 应用程序,该应用程序克隆git存储库,调用bundle installrake dist任务,然后将创建的文件上传到GitHub存储库。克隆存储库的构建任务使用 Rake Pipeline ,它使用execjs gem来构建二进制文件。

我创建了一个位于https://github.com/pangratz/github-uploader-test的示例应用,它说明了问题所在。应用程序的目录结构如下:

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

该应用程序本身是一个简单的 sinatra 应用程序,其get '/'路径如下:

upload.rb

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

出于演示目的,project文件夹模拟克隆的git存储库。它包含RakefileAssetfileGemfileGemfile.lock

项目/ Rake文件

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

项目/ Assetfile

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

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

项目/ 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

bundle install的调用似乎有效。问题是rake dist失败并显示错误Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes.

heroku应用程序本身是使用选项--stack cedar创建的。

我还创建了一个使用Execjs的路由'/ test',这不会失败。所以它看起来 Bundler.with_clean_env存在问题而未找到已安装的JavaScript运行时...

upload.rb

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

2 个答案:

答案 0 :(得分:0)

您也可以尝试设置ENV['BUNDLE_GEMFILE']=/path/to/project/Gemfile。这应该确保install和exec找到正确的Gemfile。

答案 1 :(得分:0)

我在Heroku上打开了一个问题,我可以解决这个问题。问题是Dir.chdir("project")Bundler.with_clean_env结合导致找到JavaScript运行时所需的PATH无效。长话短说,这是工作解决方案:

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

关于解决方案的说明:--without WATWAT是必需的,因为Heroku会使用bundle install --without development安装您的应用。由于--without会被记住以进行连续调用,并且development中需要Assetfile组的宝石,因此必须覆盖此选项。使用--without ''以某种方式不起作用,因此我使用不存在的组WATWAT来包含Gemfile中的所有组。