2008-10-04 11 views

Antwort

15

Entweder

irb(main):002:0> require 'rbconfig' 
=> true 
irb(main):003:0> Config::CONFIG["arch"] 
=> "i686-linux" 

oder

irb(main):004:0> RUBY_PLATFORM 
=> "i686-linux" 
+1

Wollen Sie damit sagen nicht 'Config :: CONFIG [‚host_os‘]'? –

+3

"Verwenden Sie RbConfig anstelle von obsolet und veraltete Config" => '' 'RbConfig :: CONFIG [" arch "]' '' – jtzero

+1

@jtzero Wenn Sie eine vollständigere Antwort in den Kommentaren bieten, werde ich die 2008 geschriebene Antwort aktualisieren –

121

Verwenden Sie die RUBY_PLATFORM konstant, und es gegebenenfalls in einem Modul wickeln, um es freundlicher zu machen:

module OS 
    def OS.windows? 
    (/cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM) != nil 
    end 

    def OS.mac? 
    (/darwin/ =~ RUBY_PLATFORM) != nil 
    end 

    def OS.unix? 
    !OS.windows? 
    end 

    def OS.linux? 
    OS.unix? and not OS.mac? 
    end 
end 

Es ist nicht perfekt, aber es funktioniert gut für die Plattformen, auf denen ich arbeite, und es ist einfach genug, es zu erweitern.

+7

Ein Fall, in dem es nicht funktioniert, ist, wenn Sie jruby verwenden. –

+6

für jruby, verwenden Sie besser 'RbConfig :: CONFIG [" host_os "]', um Ihr Betriebssystem zu bekommen. – Pred

+2

Gibt es irgendwo wo etwas wie dieses in ein Juwel verpackt ist, das man verwenden könnte, anstatt es zu kopieren/einfügen? Wenn ja, wo? :) – lindes

6

Versuchen Sie, die Launchy gem (gem install launchy):

require 'launchy' 
Launchy::Application.new.host_os_family # => :windows, :darwin, :nix, or :cygwin 
+0

Das ist Launchy :: Application.new.host_os_family in 2.1.0. – fakeleft

+0

FYI - Launchy verwendet rbconfig: https://github.com/copiousfreetime/launchy/blob/master/lib/launchy/detect/host_os.rb – codecraig

4
require 'rbconfig' 
include Config 

case CONFIG['host_os'] 
    when /mswin|windows/i 
    # Windows 
    when /linux|arch/i 
    # Linux 
    when /sunos|solaris/i 
    # Solaris 
    when /darwin/i 
    #MAC OS X 
    else 
    # whatever 
end 
+0

Ich denke, das sollte 'case Config :: CONFIG ['host_os'] '? – equivalent8

+0

eigentlich in Ruby 2 sollte es 'RbConfig :: Obsolete :: CONFIG ['Host_os']' ... + keine Notwendigkeit, die 'Config' enthalten – equivalent8

+0

Ändern Sie die' include' oder beide Arten von Modulen, und dann ist dies die beste Antwort IMO. Beachten Sie, wie er das Modul "included", also keine Notwendigkeit für RbConfig oder Config. – Pred

-3

Wenn ich muß nur wissen, ob es ein Windows- oder Unix-ähnliches Betriebssystem ist es

oft genug ist
is_unix = is_win = false 
File::SEPARATOR == '/' ? is_unix = true : is_win = true 
+1

Datei :: SEPARATOR gibt/in Windows, so dass dies nicht funktioniert – peter

+2

Schlechte Übung rundherum. Wenn Sie wissen möchten, was der Dateitrenner ist, verwenden Sie 'File :: SEPARATOR'. Es ist am besten, die Plattform wie in Ruby zu ducken. Wenn Sie jedoch wissen müssen, ob es sich bei der Plattform um Windows handelt, stellen Sie die Frage, anstatt zu versuchen, sie abzuleiten. –

17

(Warnung: @Peter Wagenet Kommentar lesen) Ich mag dies, verwenden die meisten Menschen rubygems, ist es zuverlässig, ist Cross-Plattform

irb(main):001:0> Gem::Platform.local 
=> #<Gem::Platform:0x151ea14 @cpu="x86", @os="mingw32", @version=nil> 
irb(main):002:0> Gem::Platform.local.os 
=> "mingw32" 

Update Verwendung in Verbindung mit "Update! Addition! Rubygems nowadays..." zu mildern, wenn Gem::Platform.local.os == 'java'

+3

Auf jruby meldet es nur "java", also reicht es nicht, wenn jemand jruby laufen lässt. –

6

ich eine zweite Antwort, mehr Optionen in den Kampf hinzuzufügen. The os rubygem, und die github page hat eine verwandte Projektliste.

 
require 'os' 

>> OS.windows? 
=> true # or OS.doze? 

>> OS.bits 
=> 32 

>> OS.java? 
=> true # if you're running in jruby. Also OS.jruby? 

>> OS.ruby_bin 
=> "c:\ruby18\bin\ruby.exe" # or "/usr/local/bin/ruby" or what not 

>> OS.posix? 
=> false # true for linux, os x, cygwin 

>> OS.mac? # or OS.osx? or OS.x? 
=> false 
0

Wir haben ziemlich gut so weit mit dem folgenden Code

def self.windows? 
    return File.exist? "c:/WINDOWS" if RUBY_PLATFORM == 'java' 
    RUBY_PLATFORM =~ /mingw32/ || RUBY_PLATFORM =~ /mswin32/ 
    end 

    def self.linux? 
    return File.exist? "/usr" if RUBY_PLATFORM == 'java' 
    RUBY_PLATFORM =~ /linux/ 
    end 

    def self.os 
    return :linux if self.linux? 
    return :windows if self.windows? 
    nil 
    end 
Verwandte Themen