0

我有一个具有以下环境的 Ruby-on-Rails (3.2) 应用程序:

  • 部署:capistrano,标准文件夹结构(my_app/current, /shared, /releases
  • Ruby:v2.3从源代码安装在/usr/local/bin/ruby. 不使用 rvm 或 rbenv
  • Bundler:使用capistrano-bundler,安装my_app在 capistrano 标准层次结构的级别my_app/shared/bundler
  • 应用服务器:使用passenger-phusion和nginx,启动管理systemctl

问题:我正在使用 gem diffy,它使用diff-lcsldiff提供的可执行文件。此可执行文件位于实际上是捆绑程序生成的存根处。现在,当我输入这样的代码时:stub 被执行并引发以下错误:/home/my_user/my_app/shared/bundle/ruby/2.3.0/bin/ldiffDiffy::Diff.new('abcd', 'abcde').to_s

/usr/local/lib/ruby/site_ruby/2.3.0/rubygems.rb:289:in `find_spec_for_exe': can't find gem diff-lcs (>= 0.a) with executable ldiff (Gem::GemNotFoundException)
from /usr/local/lib/ruby/site_ruby/2.3.0/rubygems.rb:263:in `bin_path'
from /home/my_user/my_app/shared/bundle/ruby/2.3.0/bin/ldiff:24:in `<main>'

请注意,这适用于 rails 控制台,但不适用于服务器。查看diffy.rb,我无法控制 diffy 正在执行的实际命令(我可以放在哪里bundle exec diffy ...)。

如何解决这个问题?唯一的方法似乎是取消出售的 gem 并在系统级别安装所有 gem。

PS:我在使用时遇到了同样的问题[wkhtmltopdf][6],但是,我wkhtmltopdf提供了一个配置设置来使用本机包。

4

1 回答 1

0

显然,乘客没有得到PATH正确的,唯一ENV['PATH']的位置是由bundler:添加的/home/my_user/my_app/shared/bundle/ruby/2.3.0/binPhusion 乘客文档也没有明确阐明这种行为。nginx.conf通过在:中包含此指令来解决此问题passenger_env_var PATH $PATH;。这使得现有路径被传递给乘客流程。

于 2017-12-26T04:40:06.283 回答