使用“:platforms =>”在你的gemfile工作?

时间:2011-12-07 19:30:25

标签: ruby ruby-on-rails-3 windows-7 bundler ubuntu-11.04

我有一个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下的here),它告诉我“如果宝石只应在特定平台或平台集中使用,您可以指定它们”,样本如下:

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

7 个答案:

答案 0 :(得分:19)

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

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

您还会注意到ruby -e 'puts RUBY_PLATFORM'输出i386-cygwin,而非i386-mingw32i386-mswin,就像在Windows ruby​​上一样。

您是否在cygwin环境中工作?

答案 1 :(得分:10)

将代码添加到Gemfile中,这样可以排除/包含gems,具体取决于操作系统平台

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

答案 2 :(得分:4)

平台的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,因为另一个依赖项(不受平台限制)取决于它的安装。

答案 3 :(得分:1)

我不确定:平台开关,因为我从未使用它。但是,我认为适用于您的场景的替代方法是将您的Gemfile中的'group'块中的两个gem的声明包装起来。比如...

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

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

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

答案 4 :(得分:0)

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

这对我来说非常好。

答案 5 :(得分:0)

@ 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上安装......

答案 6 :(得分:0)

容易

gem 'wdm', '~> 0.1.0' if Gem.win_platform?

具有1个依赖关系的Gemfile的完整示例,仅适用于Windows环境。

source 'https://rubygems.org'

group :development, :test do
  gem 'jekyll', '>= 4.0.0'
  gem 'jekyll-target-blank', '>= 2.0.0'
  gem 'jekyll-redirect-from', '>= 0.15.0'
  gem 'jekyll-sitemap', '>= 1.4.0'
  gem 'jekyll-toc', '>= 0.12.2'
  gem  'rouge', '>= 3.14.0'
  gem 'wdm', '>= 0.1.1' if Gem.win_platform?
end