命令行ruby脚本访问libs文件夹

时间:2010-01-25 22:11:23

标签: ruby command-line

我正在尝试创建一个主要由ruby脚本组成的应用程序,这些脚本将从命令行运行(特别是cron)。我想有一个libs文件夹,所以我可以在其中放置封装的,可重用的类/模块,并能够从任何脚本访问它们。

我希望能够将我的脚本放入“bin”文件夹中。

让他们访问libs文件夹的最佳方法是什么?我知道我可以通过命令行参数添加到加载路径,或者在每个命令行脚本的顶部添加。在PHP中,创建自定义.ini文件并将cli指向ini文件有时更有意义,因此您可以将它们全部放在一个pop中。

红宝石有类似之处吗?根据您的经验,最好的方式是什么?

4 个答案:

答案 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环境变量设置为系统上的任何文件夹