내 Ruby 프로그램이 Windows와 Mac에서 다른 작업을 수행하기를 원합니다. 내 프로그램이 어떤 시스템에서 실행되고 있는지 어떻게 알 수 있습니까?
답변:
RUBY_PLATFORM
상수를 사용 하고 선택적으로 모듈에 래핑하여 더 친숙하게 만듭니다.
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
완벽하지는 않지만 내가 개발하는 플랫폼에서 잘 작동하며 확장하기가 쉽습니다.
RbConfig::CONFIG["host_os"]
OS를 사용 하는 것이 좋습니다 .
(경고 : @Peter Wagenet의 의견을 읽으십시오) 나는 이것을 좋아합니다. 대부분의 사람들은 rubygems를 사용 합니다.
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"
업데이트 와 함께 사용하는 "업데이트! 추가! 젬 요즘 ..." 때 완화하는Gem::Platform.local.os == 'java'
어느 한 쪽
irb(main):002:0> require 'rbconfig'
=> true
irb(main):003:0> Config::CONFIG["arch"]
=> "i686-linux"
또는
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 ': 더 이상 사용되지 않고 더 이상 사용되지 않는 Config 대신 RbConfig를 사용합니다 .` 그래서 나는 그것을 사용하고 RbConfig::CONFIG.each
모든 다른 값을 나열했습니다. 원하는 것을 찾는 데 도움이되는 내용을 찾을 수 있습니다.
나는 싸움에 더 많은 옵션을 추가하기 위해 두 번째 대답이 있습니다. os rubygem 및 github 페이지 에는 관련 프로젝트 목록이 있습니다.
'os'필요 >> OS.windows? => true # 또는 OS.doze? >> OS.bits => 32 >> OS.java? => true # jruby에서 실행중인 경우. 또한 OS.jruby? >> OS.ruby_bin => "c : \ ruby18 \ bin \ ruby.exe"# 또는 "/ usr / local / bin / ruby"또는 기타 >> OS.posix? => false # linux, os x, cygwin의 경우 참 >> OS.mac? # 또는 OS.osx? 또는 OS.x? => 거짓
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
case Config::CONFIG['host_os']
?
RbConfig::Obsolete::CONFIG['host_os']
... +를 포함 할 필요가 없습니다Config
include
모듈 유형 또는 두 가지 유형을 모두 변경하면 이것이 최상의 답변 IMO입니다. 그가 include
모듈을 어떻게 만들 었는지 확인 하십시오. 따라서 RbConfig 또는 Config가 필요하지 않습니다.
최신 정보! 부가! Rubygems는 요즘 Gem.win_platform?
.
명확성을 위해 Rubygems 리포지토리 및이 리포지토리의 사용 예 :
def self.ant_script
Gem.win_platform? ? 'ant.bat' : 'ant'
end
우리는 지금까지 다음 코드로 꽤 잘 해왔습니다.
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
이미 어느 정도 처리 된 대부분의 Ruby 설치에서 쉽게 액세스 할 수있는 항목의 경우 다음을 권장합니다.
Gem::Platform.local.os
# => 예. "mingw32", "java", "linux", "cygwin", "aix", "dalvik"( 코드 )Gem.win_platform?
# => 예. 참, 거짓 ( 코드 )이 스크립트와 내가 아는 다른 모든 플랫폼 검사 스크립트는 다음과 같은 기본 변수 해석을 기반으로합니다.
RbConfig::CONFIG["host_os"]
# => 예. "linux-gnu"(코드 1 , 2 )RbConfig::CONFIG["arch"]
# => 예. "i686-linux", "i386-linux-gnu"( Ruby 인터프리터가 컴파일 될 때 매개 변수로 전달됨 )RUBY_PLATFORM
# => 예. "i386-linux-gnu", "darwin"-JRuby 에서 "java"를 반환합니다. ( 코드 )
/cygwin|mswin|mingw|bccwin|wince|emx/
RUBY_ENGINE
# => 예. "루비", "jruby"종속성을 신경 쓰지 않고 좀 더 사용자 친화적 인 것을 원하는 경우 라이브러리를 사용할 수 있습니다. 특히 OS 는 OS.mac?
또는 OS.posix?
. 플랫폼 은 다양한 유닉스 플랫폼을 잘 구별 할 수 있습니다. Platform::IMPL
예를 들어 반환됩니다. : linux, : freebsd, : netbsd, : hpux. sys-uname 및 sysinfo 는 유사합니다. utilinfo 는 매우 기본적이며 Windows, Mac 및 Linux 이외의 모든 시스템에서 실패합니다.
다른 Linux 배포와 같은 특정 시스템 세부 정보가 포함 된 고급 라이브러리를 원한다면 Ruby에서 Linux 배포 감지에 대한 내 대답을 참조하십시오 .
RUBY_PLATFORM
또는 RbConfig::CONFIG["host_os"]
채워됩니다. 코드를 보면 아직 명확하지 않습니다.
Windows 또는 Unix와 유사한 OS인지 알고 싶을 때
is_unix = is_win = false
File::SEPARATOR == '/' ? is_unix = true : is_win = true
File::SEPARATOR
. Ruby에서 개발하는 것처럼 플랫폼을 더킹하는 것이 가장 좋습니다. 그러나 플랫폼이 Windows인지 알아야한다면 추론하지 말고 질문하십시오.