代码之家  ›  专栏  ›  技术社区  ›  Sean Clark Hess

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

  •  3
  • Sean Clark Hess  · 技术社区  · 14 年前

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

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

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

    红宝石有什么相似的吗?根据你的经验,最好的方法是什么?

    4 回复  |  直到 14 年前
        1
  •  4
  •   dan    14 年前

    在每个bin/可执行文件的顶部,可以将其放在顶部

    #!/usr/bin/env ruby
    
    $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib')
    require 'libfile'
    
    [etc.]
    

    你在找不同的东西吗?

    如果你把你的应用程序变成一个RubyGem并在你的系统上安装Gem,你甚至不需要把这些东西放在最上面。在这种情况下,需求声明就足够了。

        2
  •  1
  •   user198470    14 年前

    如果您想在全局范围内使用类/模块,为什么不把它们移到您的ruby lib主目录中呢?例如: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
    
        3
  •  1
  •   user198470    14 年前

    肖恩,

    我知道,没有办法不需要一个图书馆。我想如果你想让你的红宝石如此个性化,你可以使用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脚本一样运行它,但是使用我们的新解释器。您会注意到我不需要包含任何库或在源代码中编写函数,因为它都是在我们的解释器中定义的。

    这可能不是最理想的方法,但这是我唯一能想到的方法。

    干杯

        4
  •  0
  •   Sean Clark Hess    14 年前

    有一个rubylib环境变量可以设置为系统上的任何文件夹