скрипты ruby ​​из командной строки, обращающиеся к папке libs - PullRequest
3 голосов
/ 26 января 2010

Я пытаюсь создать приложение, которое будет в основном состоять из скриптов ruby, которые будут запускаться из командной строки (в частности, cron). Я хочу иметь папку libs, чтобы я мог помещать туда инкапсулированные, повторно используемые классы / модули и иметь доступ к ним из любого скрипта.

Я хочу, чтобы мои скрипты могли быть помещены в папку «bin».

Как лучше всего предоставить им доступ к папке libs? Я знаю, что могу добавить к пути загрузки с помощью аргумента командной строки или в верхней части каждого сценария командной строки. В PHP иногда имеет смысл создать собственный INI-файл и указать cli на INI-файл, чтобы вы получили их все в одной папке.

Что-нибудь похожее на рубин? Исходя из вашего опыта, как лучше всего попасть сюда?

Ответы [ 4 ]

4 голосов
/ 26 января 2010

В верхней части каждого бина / исполняемого файла, вы можете поместить это вверху

#!/usr/bin/env ruby

$:.unshift(File.join(File.dirname(__FILE__), '..', 'lib')
require 'libfile'

[etc.]

Вы искали что-то другое?

Если вы превратили свое приложение в драгоценный камень Ruby и установили драгоценный камень в свою систему, вам даже не нужно помещать этот материал на вершину. В этом случае будет достаточно оператора require.

1 голос
/ 26 января 2010

Шон,

Нет способа не требовать библиотеки, о которой я знаю. Я думаю, если вы хотите персонализировать свой 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, но с нашим новым интерпретатором. Вы заметите, что мне не нужно было включать какие-либо библиотеки или писать функцию в исходном коде, потому что все это определено в нашем интерпретаторе.

Вероятно, это не самый идеальный метод, но это единственный, который я могу придумать.

Приветствия

1 голос
/ 26 января 2010

Если вы хотите использовать ваши классы / модули глобально, почему бы просто не переместить их в основной каталог 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
0 голосов
/ 28 января 2010

Существует переменная среды RUBYLIB, которую можно установить в любую папку в системе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...