gpt4 book ai didi

ruby - 从命令行更容易使用 ruby​​gems?

转载 作者:太空宇宙 更新时间:2023-11-03 16:58:31 25 4
gpt4 key购买 nike

通常要从命令行使用 Ruby 库,我可以这样做:

ruby -rfastercsv -e 'code'

不幸的是,这不适用于 ruby​​gems,因为默认情况下它们未启用,并且 ruby​​gems 覆盖 require 的任何操作似乎都不适用于 -r 切换,所以我不得不改为这样做:

ruby -e 'require "rubygems"; require "fastercsv"; code'

单行代码非常烦人——42 个字符的开销,而非 ruby​​gems 库只有 13 个字符。有什么办法可以避免吗?

我写了这个脚本来解决这个问题(它的工作原理是允许多个 -e "code",并且 require 是幂等的,所以它不应该干扰-p/-n 或据我所知的任何其他内容),但这一切都很丑陋,我不介意更优雅的解决方案:

args = []
until ARGV.empty?
arg = ARGV.shift
if arg =~ /\A-r(.*)\Z/
args << "-e" << "require 'rubygems'; require '#{$1.empty? ? ARGV.shift : $1}'"
else
args << arg
end
end
exec "ruby", *args

最佳答案

我的第一次尝试(以上)仅适用于 -e。它不适用于 ruby -rfoo bar.rb 等文件中的脚本。此脚本通过自要求技巧支持两者(其文件名必须以 .rb 结尾):

#!/usr/bin/env ruby

if $0 == __FILE__
args = []
libs = []
last_lib = nil
while arg = ARGV.shift
if arg == "--"
args << arg
args += ARGV
break
elsif arg =~ /\A-r(.*)\Z/
libs << ($1.empty? ? ARGV.shift : $1)
last_lib = args.size
else
args << arg
end
end
if last_lib
libself = __FILE__.chomp(".rb")
ENV["RUBYGEMS_LIBS"] = libs.join(":")
args[last_lib, 0] = ["-r", libself]
end
exec "ruby", *args
else
require "rubygems"
libs = ENV["RUBYGEMS_LIBS"]||""
libs.split(":").each{|lib|
require lib
}
end

关于ruby - 从命令行更容易使用 ruby​​gems?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3112480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com