我正在尝试使用rake编写构建脚本,该脚本将在Windows和Linux上运行。假设我有以下rake任务:
task:check do
sh "dir"
end
这适用于Windows,但不适用于其他操作系统。使用sh
命令处理操作系统差异的最佳方法是什么?我特别希望在操作系统之间进行以下任务,但它目前在Windows上运行:
task:check do
%w(npm bower kpm gulp).each do |cmd|
begin sh "#{cmd} --version > NUL" rescue raise "#{cmd} doesn't exists globally" end
end
end
答案 0 :(得分:4)
查看os gem。您可以将任务定义包装在对平台的检查中,甚至可以使用一些帮助程序来编写更多通用任务。
这样的事情可能很方便:
>> OS.dev_null
=> "NUL" # or "/dev/null" depending on which platform
或者只是让它们特定于操作系统:
if OS.windows?
task :whatever do
# ...
end
elsif OS.linux?
task :whatever do
# ...
end
end
答案 1 :(得分:0)
Ruby知道它编译的操作系统,以及它运行的是什么,因为它必须知道路径分隔符,行尾字符等。我们可以使用内置函数找出它所知道的内容。在常量和/或模块中。
使用RUBY_PLATFORM
常量:
在Mac OSX上:
RUBY_PLATFORM # => "x86_64-darwin13.0"
在Linux上:
RUBY_PLATFORM # => "x86_64-linux"
您也可以使用Gem :: Platform:
在Mac OSX上:
Gem::Platform.local # => #<Gem::Platform:0x3fe859440ef4 @cpu="x86_64", @os="darwin", @version="13">
Gem::Platform.local.os # => "darwin"
在Linux上:
Gem::Platform.local # => #<Gem::Platform:0x13e0b60 @cpu="x86_64", @os="linux", @version=nil>
Gem::Platform.local.os # => "linux"
然后是Ruby附带的RbConfig模块:
在Mac OS上:
RbConfig::CONFIG['target_cpu'] # => "x86_64"
RbConfig::CONFIG['target_os'] # => "darwin13.0"
RbConfig::CONFIG['host_cpu'] # => "x86_64"
RbConfig::CONFIG['host_os'] # => "darwin13.4.0"
在Linux上:
RbConfig::CONFIG['target_cpu'] # => "x86_64"
RbConfig::CONFIG['target_os'] # => "linux"
RbConfig::CONFIG['host_cpu'] # => "x86_64"
RbConfig::CONFIG['host_os'] # => "linux-gnu"
A quick search会为此返回一些匹配,包括Stack Overflow上的许多匹配。