Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 使用rake sh命令处理操作系统差异的最佳方法_Ruby_Rake - Fatal编程技术网

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

Ruby 使用rake sh命令处理操作系统差异的最佳方法,ruby,rake,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

我正在尝试用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
看看这本书。您可以在检查平台时包装任务定义,甚至可以使用一些帮助程序编写更通用的任务

像这样的东西可能很方便:

>> 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
看看这本书。您可以在检查平台时包装任务定义,甚至可以使用一些帮助程序编写更通用的任务

像这样的东西可能很方便:

>> 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

Ruby知道它是在什么操作系统上编译的,知道它在什么操作系统上运行,因为它必须知道路径分隔符、行尾字符等。我们可以通过使用内置常量和/或模块了解它知道什么

使用
RUBY\u平台
常量:

在Mac OSX上:

RUBY_PLATFORM # => "x86_64-darwin13.0"
Gem::Platform.local # => #<Gem::Platform:0x3fe859440ef4 @cpu="x86_64", @os="darwin", @version="13">
Gem::Platform.local.os # => "darwin"
在Linux上:

RUBY_PLATFORM # => "x86_64-linux"
您还可以使用Gem::Platform:

在Mac OSX上:

RUBY_PLATFORM # => "x86_64-darwin13.0"
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"
 RbConfig::CONFIG['target_cpu'] # => "x86_64"
 RbConfig::CONFIG['target_os']  # => "linux"
 RbConfig::CONFIG['host_cpu']   # => "x86_64"
 RbConfig::CONFIG['host_os']    # => "linux-gnu"

为此返回大量命中率,包括堆栈溢出中的许多命中率。

Ruby知道编译它的操作系统,以及它运行在什么操作系统上,因为它必须知道路径分隔符、行尾字符等。我们可以使用内置常量和/或模块了解它知道什么

使用
RUBY\u平台
常量:

在Mac OSX上:

RUBY_PLATFORM # => "x86_64-darwin13.0"
Gem::Platform.local # => #<Gem::Platform:0x3fe859440ef4 @cpu="x86_64", @os="darwin", @version="13">
Gem::Platform.local.os # => "darwin"
在Linux上:

RUBY_PLATFORM # => "x86_64-linux"
您还可以使用Gem::Platform:

在Mac OSX上:

RUBY_PLATFORM # => "x86_64-darwin13.0"
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"
 RbConfig::CONFIG['target_cpu'] # => "x86_64"
 RbConfig::CONFIG['target_os']  # => "linux"
 RbConfig::CONFIG['host_cpu']   # => "x86_64"
 RbConfig::CONFIG['host_os']    # => "linux-gnu"

为此返回大量命中率,包括堆栈溢出中的许多命中率。

太棒了,谢谢!与此相关:
sh“#{cmd}--version>{OS.dev_null}”
注意这个gem,而不是Windows!根据您的用例,这可能不是您所期望的。太棒了,谢谢!与此相关:
sh“#{cmd}--version>{OS.dev_null}”
注意这个gem,而不是Windows!根据您的用例,这可能不是您所期望的。这几乎是“@theTinMan”的复制品,但并非完全如此。请查看例外答案。“几乎是一个副本”,而不是“一个副本”,否则我会将其作为副本关闭。这几乎是“@theTinMan”的副本,但不完全是。请查看例外答案,“几乎是重复的”,而不是“重复的”,否则我会将其作为重复关闭。