使用rake sh命令处理操作系统差异的最佳方法

时间:2014-10-24 16:02:58

标签: ruby rake

我正在尝试使用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

2 个答案:

答案 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上的许多匹配。