在您的gefile中使用“:Platels=>”行吗?

hfsqlsce  于 2022-09-21  发布在  Ruby
关注(0)|答案(8)|浏览(95)

我有一个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
ktecyv1j

ktecyv1j1#

:platforms => :ruby确实将gem排除在Windows上。

然而,它在Cygwin环境中“不”起作用。在Cygwin中,它认为平台是:MRI。

您还会注意到,ruby -e 'puts RUBY_PLATFORM'输出的是i386-cygwin,而不是Windows Ruby上的i386-mingw32i386-mswin

你是在Cygwin环境中工作吗?

sg24os4d

sg24os4d2#

将如下代码添加到Gemfile中,该代码根据操作系统平台排除/包括gem

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

w51jfk4q3#

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

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

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

在Windows上,您可能不需要therubyracere(它实际上不工作),但您可能需要execjs,以便CoffeeScrip或资产管道的其他细节正常工作

在您的情况下,我将这样做:

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

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

ar7v8xwq

ar7v8xwq4#

Rails 5:

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

nhn9ugyo5#

我对:平台开关不太确定,因为我从来没有用过它。然而,我认为适用于您的场景的另一种方法是将您对这两个gee的声明 Package 在Gemfile中的“group”块中。比如..。

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

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

请注意,我相信Bundler仍会在开发中安装它们(与依赖项检查有关),但它们不会实际加载,因此不会造成问题。

42fyovps

42fyovps6#

简单如

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

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

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
7uzetpgm

7uzetpgm7#

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

这对我来说很管用。

qlzsbp2j

qlzsbp2j8#

@ffoig的答案的一个变体适用于我,适用于所有Windows环境,而仅使用RUBY_PLATFORM=~ /win32/则不起作用:

if RUBY_PLATFORM =~ /mswin|mingw|cygwin/i

  gem 'windows-only'

else

  gem 'non-windows'    

end

我同意有不同的gef文件并不理想,然而,因为我在Heroku上使用unicorn来服务我的Jekyll博客,所以我需要gem unicorn--而这依赖于kgio,几个消息来源已经证实,实际上不可能在Windows上安装kgio

相关问题