1

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

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

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

该应用程序本身是一个带有路由的简单sinatraget '/'应用程序,如下所示:

上传.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 存储库。它包含一个RakefileAssetfile和。GemfileGemfile.lock

项目/耙文件

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

项目/资产文件

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

我还创建了一个使用的路由'/test'Execjs并且这不会失败。因此,似乎Bundler.with_clean_env没有找到已安装的 JavaScript Runtime 存在问题...

上传.rb

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

2 回答 2

0

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

于 2012-06-20T16:50:03.360 回答
0

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

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中需要 group的 gem,Assetfile因此必须覆盖此选项。使用--without ''某种方式不起作用,所以我使用不存在的组WATWAT将所有组包含在Gemfile.

于 2012-07-02T18:04:56.243 回答