Ruby 使用rake sh命令处理操作系统差异的最佳方法
我正在尝试用rake编写一个构建脚本,它将在Windows和Linux上运行。假设我有以下rake任务: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
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”的副本,但不完全是。请查看例外答案,“几乎是重复的”,而不是“重复的”,否则我会将其作为重复关闭。