在gemfile中使用“:platforms =>”工作吗?

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

gem 'therubyracer', :platforms => :ruby gem 'execjs', :platforms => :ruby 

在Linux VM上运行bundle install ,应用程序启动正常。 但在Windows上我得到:

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

现在,根据我的阅读( 这里在PLATFORMS下),它告诉我“如果一个gem只能用于特定平台或一组平台,你可以指定它们”,样本是这样的:

 gem "weakling", :platforms => :jruby 

它说“ ruby C Ruby (MRI) or Rubinius, but NOT Windows ”。 所以对我来说,捆绑者应该忽略Windows上的execjs行。 但是在Windows上运行bundle install我看到了这个:

 Installing execjs (1.2.11) 

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

 PS>bundle -v Bundler version 1.0.21 

:platforms => :ruby确实排除了在Windows上安装的gem。

但是,它在cygwin环境中不起作用。 在cygwin中,它认为平台是:mri。

你还会注意到ruby -e 'puts RUBY_PLATFORM'输出i386-cygwin ,而不是i386-mingw32i386-mswin就像它在Windows ruby​​上那样。

你是在cygwin环境中工作吗?

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

 if RUBY_PLATFORM=~ /win32/ gem "windows-only-gem" else gem "os-agnostic-gem" end 

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

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

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

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

在你的情况下,我会做:

 gem "execjs" gem "therubyracer", :platforms => :ruby 

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

Rails 5:

 if Gem.win_platform? # Install gem for Windows else # Install another gem end 

我不确定:平台开关,因为我从未使用它。 但是,我认为适用于您的场景的另一种方法是将这两个gem中的声明包装在Gemfile的“group”块中。 如…

 group :production do gem 'therubyracer' gem 'execjs' end 

这样,这些gem只会在您的生产环境中使用,而不会在开发中使用。

请注意,我相信bundler仍会在开发中安装它们(与依赖项检查有关),但它们实际上不会被加载,因此不应该导致问题。

 gem 'win32-security', '~> 0.3.1' if (RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/) 

这对我很有用。

@ ffoeg的答案变体对我有用,并处理所有的Windows环境,而只是使用RUBY_PLATFORM=~ /win32/不起作用:

 if RUBY_PLATFORM =~ /mswin|mingw|cygwin/i gem 'windows-only' else gem 'non-windows' end 

我同意拥有不同的gemfiles是不理想的,但是因为我使用unicorn在Heroku上为我的Jekyll博客服务,所以我需要gem unicorn – 这依赖于kgio ,几个消息来源已经确认几乎无法安装在Windows上。 ..