Ich möchte mein Ruby-Programm verschiedene Dinge auf einem Mac als auf Windows tun. Wie kann ich herausfinden, auf welchem System mein Programm läuft?Wie kann ich herausfinden, auf welchem Betriebssystem mein Ruby-Programm läuft?
Antwort
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"
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.
Ein Fall, in dem es nicht funktioniert, ist, wenn Sie jruby verwenden. –
für jruby, verwenden Sie besser 'RbConfig :: CONFIG [" host_os "]', um Ihr Betriebssystem zu bekommen. – Pred
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
Versuchen Sie, die Launchy gem (gem install launchy
):
require 'launchy'
Launchy::Application.new.host_os_family # => :windows, :darwin, :nix, or :cygwin
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
Ich denke, das sollte 'case Config :: CONFIG ['host_os'] '? – equivalent8
eigentlich in Ruby 2 sollte es 'RbConfig :: Obsolete :: CONFIG ['Host_os']' ... + keine Notwendigkeit, die 'Config' enthalten – equivalent8
Ä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
Wenn ich muß nur wissen, ob es ein Windows- oder Unix-ähnliches Betriebssystem ist es
oft genug istis_unix = is_win = false
File::SEPARATOR == '/' ? is_unix = true : is_win = true
Datei :: SEPARATOR gibt/in Windows, so dass dies nicht funktioniert – peter
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. –
(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'
Auf jruby meldet es nur "java", also reicht es nicht, wenn jemand jruby laufen lässt. –
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
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
-Update zu tun! Zusatz! Rubygems wird heute mit Gem.win_platform?
ausgeliefert.
Example usages in the Rubygems repo, und dieses, für Klarheit:
def self.ant_script
Gem.win_platform? ? 'ant.bat' : 'ant'
end
Wollen Sie damit sagen nicht 'Config :: CONFIG [‚host_os‘]'? –
"Verwenden Sie RbConfig anstelle von obsolet und veraltete Config" => '' 'RbConfig :: CONFIG [" arch "]' '' – jtzero
@jtzero Wenn Sie eine vollständigere Antwort in den Kommentaren bieten, werde ich die 2008 geschriebene Antwort aktualisieren –