你的gemfile中使用":platforms =>"工作吗?

jco*_*lum 15 ruby windows-7 bundler ruby-on-rails-3 ubuntu-11.04

我有一个Rails应用程序,我正在Windows上开发并部署到Linux.我怀疑我将来会完全切换到Linux.无论如何,在Linux上我需要'execjs'和'therubyracer',但我不需要Win7中的那些.所以我将这些行放在我的gemfile中:

gem 'therubyracer', :platforms => :ruby
gem 'execjs', :platforms => :ruby
Run Code Online (Sandbox Code Playgroud)

bundle install在Linux虚拟机和应用程序启动的罚款.但在Windows上我得到:

Uncaught exception: Could not find execjs-1.2.11 in any of the sources

现在,从我读(这里下船)它告诉我,"如果一个宝石只应在特定的平台上使用或设置的平台,您可以指定他们"和样品是这样的:

gem "weakling",   :platforms => :jruby 
Run Code Online (Sandbox Code Playgroud)

它说" ruby C Ruby (MRI) or Rubinius, but NOT Windows".所以对我来说,捆绑者应该忽略execjsWindows上的这一行.但是在Windows上我跑的时候bundle install看到了这个:

Installing execjs (1.2.11)
Run Code Online (Sandbox Code Playgroud)

所以这对我说我错过了关于docs的东西,或者bundler忽略了platform命令.难道我做错了什么?

PS>bundle -v
Bundler version 1.0.21
Run Code Online (Sandbox Code Playgroud)

Edw*_*son 19

:platforms => :ruby 确实排除了在Windows上安装宝石.

然而,它并没有在工作cygwin的环境.在cygwin中,它认为平台是:mri.

您还会注意到,ruby -e 'puts RUBY_PLATFORM'输出i386-cygwin,不i386-mingw32还是i386-mswin像它会在Windows上的红宝石.

你在cygwin环境中工作吗?


ffo*_*oeg 10

像这样添加代码到Gemfile,根据OS平台排除/包含gems

if RUBY_PLATFORM=~ /win32/ 
   gem "windows-only-gem"
else
   gem "os-agnostic-gem"
end
Run Code Online (Sandbox Code Playgroud)

  • 您不能在Gemfile中使用`if`块.如果这样做,那么每次在不同平台上访问项目时,都会重新生成和修改Gemfile.lock. (6认同)
  • @ffoeg:我同意你的方法有效,但我认为Luis Lavena的观点对于那些按照建议的做法在每次添加新的gem或bundle更新时检查Gemfile.lock的人都很重要.这并不是一个糟糕的做法 - 所有开发人员都拥有完全相同的gem版本(理想情况下除了平台相关的版本). (2认同)

gdf*_*dfg 6

导轨 5:

if Gem.win_platform?
  # Install gem for Windows
else
  # Install another gem
end
Run Code Online (Sandbox Code Playgroud)


Lui*_*ena 5

平台的 Bundler 概念不同于对RUBY_PLATFORM匹配或 RubyGems 行为的正常理解。

您可以在此处找到有关如何使用 Bundler 平台的完整文档:

http://bundler.io/v1.14/man/gemfile.5.html

您可能不需要therubyracer在 Windows 上(它实际上不起作用),但您可能需要execjs使 CoffeeScript 或 Asset Pipeline 的其他细节正常工作

在你的情况下,我会这样做:

gem "execjs"
gem "therubyracer", :platforms => :ruby
Run Code Online (Sandbox Code Playgroud)

更新: execjs gem 可能已安装,因为另一个依赖项(不受平台限制)依赖于它的安装。