模块 FileUtils

常量

LN_SUPPORTED
RUBY

当前运行的 Ruby 程序的路径

公共实例方法

ruby(*args, **options, &block) 点击切换源代码

使用给定的参数运行 Ruby 解释器。

示例

ruby %{-pe '$_.upcase!' <README}
# File rake-13.2.1/lib/rake/file_utils.rb, line 98
def ruby(*args, **options, &block)
  if args.length > 1
    sh(RUBY, *args, **options, &block)
  else
    sh("#{RUBY} #{args.first}", **options, &block)
  end
end
safe_ln(*args, **options) 点击切换源代码

尝试执行正常的软链接,但如果链接失败则回退到复制。

# File rake-13.2.1/lib/rake/file_utils.rb, line 110
def safe_ln(*args, **options)
  if LN_SUPPORTED[0]
    begin
      return options.empty? ? ln(*args) : ln(*args, **options)
    rescue StandardError, NotImplementedError
      LN_SUPPORTED[0] = false
    end
  end
  options.empty? ? cp(*args) : cp(*args, **options)
end
sh(*cmd, &block) 点击切换源代码

运行系统命令 cmd。如果给出了多个参数,则直接运行命令(不通过 shell,与 Kernel::exec 和 Kernel::system 相同的语义)。

建议您使用多参数形式,而不是插值用户输入,这出于可用性和安全性的考虑。使用多参数形式,您可以轻松处理包含空格或其他 shell 保留字符的文件。使用多参数形式,您的 rake 任务不会容易受到用户提供类似 ; rm # -rf / 这样的参数的影响。

如果给出了块,则在命令完成后,将使用 OK 标志(在零退出状态时为 true)和一个 Process::Status 对象来调用该块。如果没有块,则当命令以非零退出时,会引发 RuntimeError。

示例

sh 'ls -ltr'

sh 'ls', 'file with spaces'

# check exit status after command runs
sh %{grep pattern file} do |ok, res|
  if !ok
    puts "pattern not found (status = #{res.exitstatus})"
  end
end
# File rake-13.2.1/lib/rake/file_utils.rb, line 43
def sh(*cmd, &block)
  options = (Hash === cmd.last) ? cmd.pop : {}
  shell_runner = block_given? ? block : create_shell_runner(cmd)

  set_verbose_option(options)
  verbose = options.delete :verbose
  noop    = options.delete(:noop) || Rake::FileUtilsExt.nowrite_flag

  Rake.rake_output_message sh_show_command cmd if verbose

  unless noop
    res = (Hash === cmd.last) ? system(*cmd) : system(*cmd, options)
    status = $?
    status = Rake::PseudoStatus.new(1) if !res && status.nil?
    shell_runner.call(res, status)
  end
end
split_all(path) 点击切换源代码

将文件路径拆分为各个目录名称。

示例

split_all("a/b/c") =>  ['a', 'b', 'c']
# File rake-13.2.1/lib/rake/file_utils.rb, line 126
def split_all(path)
  head, tail = File.split(path)
  return [tail] if head == "." || tail == "/"
  return [head, tail] if head == "/"
  return split_all(head) + [tail]
end