Ich möchte, dass mein Ruby-Programm auf einem Mac andere Aufgaben ausführt als unter Windows. Wie kann ich herausfinden, auf welchem System mein Programm ausgeführt wird?
Ich möchte, dass mein Ruby-Programm auf einem Mac andere Aufgaben ausführt als unter Windows. Wie kann ich herausfinden, auf welchem System mein Programm ausgeführt wird?
Antworten:
Verwenden Sie die RUBY_PLATFORM
Konstante und wickeln Sie sie optional in ein Modul ein, um sie benutzerfreundlicher zu gestalten:
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
def OS.jruby?
RUBY_ENGINE == 'jruby'
end
end
Es ist nicht perfekt, funktioniert aber gut für die Plattformen, auf denen ich entwickle, und es ist einfach genug, es zu erweitern.
RbConfig::CONFIG["host_os"]
, wenn Sie Ihr Betriebssystem verwenden.
(Warnung: Lesen Sie den Kommentar von @Peter Wagenet) Ich mag das, die meisten Leute verwenden Rubygems , es ist zuverlässig und plattformübergreifend
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 heutzutage ..." , um zu mildern, wannGem::Platform.local.os == 'java'
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"
Config::CONFIG[‘host_os’]
?
RbConfig::CONFIG["arch"]
irb(main):002:0> require 'rbconfig' => false
(irb):10:in
irb_binding ': Verwenden Sie RbConfig anstelle der veralteten und veralteten Config.` Also habe ich das verwendet RbConfig::CONFIG.each
und alle verschiedenen Werte aufgelistet. Vielleicht finden Sie dort etwas, das Ihnen hilft, das zu finden, wonach Sie suchen.
Ich habe eine zweite Antwort, um dem Kampf weitere Optionen hinzuzufügen. Das os rubygem und seine Github-Seite haben eine verwandte Projektliste .
erfordern 'os' >> OS.windows? => true # oder OS.doze? >> OS.bits => 32 >> OS.java? => true # wenn du in jruby rennst. Auch OS.jruby? >> OS.ruby_bin => "c: \ ruby18 \ bin \ ruby.exe" # oder "/ usr / local / bin / ruby" oder was nicht >> OS.posix? => false # true für Linux, OS X, Cygwin >> OS.mac? # oder OS.osx? oder OS.x? => falsch
Probieren Sie das Juwel Launchy ( 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
case Config::CONFIG['host_os']
?
RbConfig::Obsolete::CONFIG['host_os']
... + keine Notwendigkeit, dasConfig
include
oder beide Modultypen, und dann ist dies die beste Antwort IMO. Beachten Sie, wie er include
das Modul verwendet hat, sodass weder RbConfig noch Config erforderlich sind.
Aktualisieren! Zusatz! Rubygems versendet heutzutage mit Gem.win_platform?
.
Beispielverwendungen im Rubygems-Repo und in diesem zur Verdeutlichung:
def self.ant_script
Gem.win_platform? ? 'ant.bat' : 'ant'
end
Mit dem folgenden Code haben wir bisher ziemlich gute Ergebnisse erzielt
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
Für etwas, das in den meisten Ruby-Installationen leicht zugänglich ist und bereits etwas für Sie verarbeitet wurde, empfehle ich Folgendes:
Gem::Platform.local.os
# => zB. "mingw32", "java", "linux", "cygwin", "aix", "dalvik" ( code )Gem.win_platform?
# => zB. wahr, falsch ( Code )Sowohl dieses als auch jedes andere mir bekannte Plattformprüfungsskript basiert auf der Interpretation dieser zugrunde liegenden Variablen:
RbConfig::CONFIG["host_os"]
# => zB. "linux-gnu" (Code 1 , 2 )RbConfig::CONFIG["arch"]
# => zB. "i686-linux", "i386-linux-gnu" (wird als Parameter übergeben, wenn der Ruby-Interpreter kompiliert wird )RUBY_PLATFORM
# => zB. "i386-linux-gnu", "darwin" - Beachten Sie, dass dies "java" in JRuby zurückgibt! ( Code )
/cygwin|mswin|mingw|bccwin|wince|emx/
RUBY_ENGINE
# => zB. "rubin", "jruby"Bibliotheken sind verfügbar, wenn Sie sich nicht um die Abhängigkeit kümmern und etwas Benutzerfreundlicheres wünschen. Insbesondere bietet OS Methoden wie OS.mac?
oder an OS.posix?
. Die Plattform kann gut zwischen verschiedenen Unix-Plattformen unterscheiden. Platform::IMPL
wird zurückkehren, z. : linux ,: freebsd ,: netbsd ,: hpux. sys-uname und sysinfo sind ähnlich. utilinfo ist äußerst einfach und schlägt auf allen Systemen außerhalb von Windows, Mac und Linux fehl.
Wenn Sie erweiterte Bibliotheken mit bestimmten Systemdetails wie verschiedene Linux-Distributionen wünschen, lesen Sie meine Antwort zum Erkennen der Linux-Distribution in Ruby .
RUBY_PLATFORM
oder RbConfig::CONFIG["host_os"]
bestückt sind. Wenn ich mir den Code anschaue, ist mir das immer noch nicht klar.
Wenn ich nur wissen muss, ob es sich um ein Windows- oder Unix-ähnliches Betriebssystem handelt, reicht dies oft aus
is_unix = is_win = false
File::SEPARATOR == '/' ? is_unix = true : is_win = true
File::SEPARATOR
. Es ist am besten, die Plattform wie bei der Entwicklung in Ruby zu ducken. Wenn Sie jedoch wissen müssen, ob es sich bei der Plattform um Windows handelt, stellen Sie die Frage, anstatt darauf zu schließen.