我有一个Rails应用程序,我正在Windows上开发,并部署到Linux上。我想我将来会完全转而使用Linux。无论如何,在Linux上我需要‘execjs’和‘therubyracer’,但在Win7中我不需要它们。因此,我将这些行放入了我的gef文件中:
gem 'therubyracer', :platforms => :ruby
gem 'execjs', :platforms => :ruby
在Linux虚拟机上运行bundle install
,应用程序启动正常。但在Windows上,我得到的是:
Uncaught exception: Could not find execjs-1.2.11 in any of the sources
现在,从我所读到的(平台下的here),它告诉我“如果一个gem只应该在一个或一组特定的平台上使用,您可以指定它们”,示例如下:
gem "weakling", :platforms => :jruby
上面写着“ruby C Ruby (MRI) or Rubinius, but NOT Windows
”。所以在我看来,Bundler应该忽略Windows上的execjs
行。然而,在Windows上,当我运行bundle install
时,我看到了以下内容:
Installing execjs (1.2.11)
所以对我来说,这意味着我遗漏了一些关于文档或捆绑包的东西,忽略了平台命令。我做错什么了吗?
PS>bundle -v
Bundler version 1.0.21
8条答案
按热度按时间ktecyv1j1#
:platforms => :ruby
确实将gem排除在Windows上。然而,它在Cygwin环境中“不”起作用。在Cygwin中,它认为平台是:MRI。
您还会注意到,
ruby -e 'puts RUBY_PLATFORM'
输出的是i386-cygwin
,而不是Windows Ruby上的i386-mingw32
或i386-mswin
。你是在Cygwin环境中工作吗?
sg24os4d2#
将如下代码添加到Gemfile中,该代码根据操作系统平台排除/包括gem
w51jfk4q3#
Bundler对平台的概念不同于对
RUBY_PLATFORM
匹配或RubyGems行为的正常理解。您可以在此处找到有关如何使用Bundler平台的完整文档:
http://bundler.io/v1.14/man/gemfile.5.html
在Windows上,您可能不需要
therubyracer
e(它实际上不工作),但您可能需要execjs
,以便CoffeeScrip或资产管道的其他细节正常工作在您的情况下,我将这样做:
更新:可能会安装execjs gem,因为另一个依赖项(不受平台限制)依赖于它的安装。
ar7v8xwq4#
Rails 5:
nhn9ugyo5#
我对:平台开关不太确定,因为我从来没有用过它。然而,我认为适用于您的场景的另一种方法是将您对这两个gee的声明 Package 在Gemfile中的“group”块中。比如..。
这样,这些gem将只在您的生产环境中使用,而不是在开发中使用。
请注意,我相信Bundler仍会在开发中安装它们(与依赖项检查有关),但它们不会实际加载,因此不会造成问题。
42fyovps6#
简单如
仅适用于Windows环境的具有1个依赖项的Gemfile的完整示例。
7uzetpgm7#
这对我来说很管用。
qlzsbp2j8#
@ffoig的答案的一个变体适用于我,适用于所有Windows环境,而仅使用
RUBY_PLATFORM=~ /win32/
则不起作用:我同意有不同的gef文件并不理想,然而,因为我在Heroku上使用
unicorn
来服务我的Jekyll博客,所以我需要gem unicorn
--而这依赖于kgio
,几个消息来源已经证实,实际上不可能在Windows上安装kgio
…