我正在尝试创建一个主要由ruby脚本组成的应用程序,这些脚本将从命令行运行(特别是cron)。我想有一个libs文件夹,所以我可以在其中放置封装的,可重用的类/模块,并能够从任何脚本访问它们。
我希望能够将我的脚本放入“bin”文件夹中。
让他们访问libs文件夹的最佳方法是什么?我知道我可以通过命令行参数添加到加载路径,或者在每个命令行脚本的顶部添加。在PHP中,创建自定义.ini文件并将cli指向ini文件有时更有意义,因此您可以将它们全部放在一个pop中。
红宝石有类似之处吗?根据您的经验,最好的方式是什么?
答案 0 :(得分:4)
在每个bin /可执行文件的顶部,您可以将其放在顶部
#!/usr/bin/env ruby
$:.unshift(File.join(File.dirname(__FILE__), '..', 'lib')
require 'libfile'
[etc.]
你在寻找不同的东西吗?
如果您将应用程序转换为Ruby gem并在系统上安装gem,则甚至不需要将这些内容放在顶部。在这种情况下,require语句就足够了。
答案 1 :(得分:1)
如果要全局使用类/模块,为什么不将它们移动到主Ruby目录?例如:/usr/lib/ruby/1.8/?
例如:
$ cat > /usr/lib/ruby/1.8/mymodule.rb
module HelloWorld
def hello
puts("Hello, World!");
end
end
我们在主lib目录中有我们的模块 - 应该可以 现在从系统的任何地方都需要它。
$ irb
irb(main):001:0> require 'mymodule'
=> true
irb(main):002:0> include HelloWorld
=> Object
irb(main):003:0> hello
Hello, World!
=> nil
答案 2 :(得分:1)
肖恩,
我知道没有办法不需要图书馆。我想如果你想个性化你的Ruby那么多你可以使用eval“自己动手”。 下面的脚本基本上用作解释器。您可以添加自己的功能并包含库。如果你真的想要,给文件提供可执行权限并将其放在/ usr / bin中。然后使用
$ myruby <source>
这是一个非常小的代码。作为一个例子,我已经包含了md5摘要库并创建了一个名为md5()
的自定义函数#!/usr/bin/ruby -w
require 'digest/md5';
def executeCode(file)
handle = File.open(file,'r');
for line in handle.readlines()
line = line.strip();
begin
eval(line);
rescue Exception => e
print "Problem with script '" + file + "'\n";
print e + "\n";
end
end
end
def checkFile(file)
if !File.exists?(file)
print "No such source file '" + file + "'\n";
exit(1);
elsif !File.readable?(file)
print "Cannot read from source file '" + file + "'\n";
exit(1);
else
executeCode(file);
end
end
# My custom function for our "interpreter"
def md5(key=nil)
if key.nil?
raise "md5 requires 1 parameter, 0 given!\n";
else
return Digest::MD5.hexdigest(key)
end
end
if ARGV[0].nil?
print "No input file specified!\n"
exit(1);
else
checkFile(ARGV[0]);
end
将其保存为myruby或myruby.rb并赋予其可执行权限(755)。现在您已准备好创建普通的ruby源文件
puts "I will now generate a md5 digest for mypass using the md5() function"
puts md5('mypass')
保存并运行它,就像使用普通的ruby脚本一样,但使用我们的新解释器。您会注意到我不需要在源代码中包含任何库或编写函数,因为它们都在我们的解释器中定义。
这可能不是最理想的方法,但它是我能想到的唯一方法。
干杯
答案 3 :(得分:0)
可以将RUBYLIB环境变量设置为系统上的任何文件夹