我尝试创建一个简单的 heroku 应用程序,该应用程序克隆git存储库,调用bundle install
,rake 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存储库。它包含Rakefile
,Assetfile
,Gemfile
和Gemfile.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
答案 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
中的所有组。