在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-mingw32
或i386-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上。 ..