我有一个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
答案 0 :(得分:19)
:platforms => :ruby
确实排除了在Windows上安装gems。
但是,它 在 cygwin 环境中工作。在cygwin中,它认为平台是:mri。
您还会注意到ruby -e 'puts RUBY_PLATFORM'
输出i386-cygwin
,而非i386-mingw32
或i386-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