【问题标题】:command-line ruby scripts accessing a libs folder命令行 ruby​​ 脚本访问 libs 文件夹
【发布时间】:2010-01-25 22:11:23
【问题描述】:

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

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

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

红宝石有什么类似的吗?根据您的经验,去这里的最佳方式是什么?

【问题讨论】:

    标签: ruby command-line


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      在每个 bin/executable 的顶部,您可以将其放在顶部

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

      您是否在寻找不同的东西?

      如果你将你的应用程序变成一个 Ruby gem 并在你的系统上安装 gem,你甚至不需要把这些东西放在顶部。在这种情况下,require 语句就足够了。

      【讨论】:

      • 不,效果很好。我只是想知道是否有更好的方法。
      • 如果你把你的应用程序变成一个 Ruby gem 并在你的系统上安装 gem,你甚至不需要把这些东西放在顶部。在这种情况下,require 语句就足够了。
      • 如果你“把它变成一个宝石”,它仍然很容易编辑吗?如果我进行更改,我不想重新导出或做任何事情。
      • 对,在这种情况下,您可能不想走 gem 路线。我通常也不这样做。我经常使用上述技术。
      • RUBYLIB 环境变量!正是我想要的
      【解决方案3】:

      如果你想在全局范围内使用你的类/模块,为什么不把它们移到你的主 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
      

      【讨论】:

      • 有没有办法通过导出一些环境变量或其他东西来将自定义目录添加到您的 ruby​​ 路径中,而不是在脚本的顶部进行?
      • ... 上面我的意思是,我想在 load_path 中添加一个目录,而不是自动需要东西
      • 所有这些关于滚动你自己的 Ruby 的讨论让我想放弃它。所以我做了。 frabble.org/myruby.tar.gz - 我称它为 MyRuby:原来的嗯?无论如何,它的工作原理与普通红宝石相同,只是有一点不同。您可以将环境变量 RUBY_LOAD_PATH 设置为您选择的目录,MyRuby 会自动为您将其添加到 $LOAD_PATH 中,以便您可以全局使用您自己的库。它目前仅适用于一个目录,但如果我决定进一步使用它,我可能会更改它。随意检查一下,让我知道你的想法。干杯
      • 哦,忘了告诉你。它是用 C 而不是 ruby​​ 编写的,所以你甚至不需要安装 Ruby 来运行它。
      • 那……太棒了。不过,必须有一种更简单的方法。宝石以某种方式操纵加载路径,所以我确信这是可能的
      【解决方案4】:

      肖恩,

      据我所知,没有办法不需要库。我想如果你想个性化你的 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​​ 脚本一样,但使用我们的新解释器。您会注意到我不需要在源代码中包含任何库或编写函数,因为它们都在我们的解释器中定义。

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

      干杯

      【讨论】:

      • 如果我误导了,我很抱歉。我对要求部分很好,但我不想使用“../”。我希望能够修改加载路径而不必在每个脚本的顶部进行
      • 但是,说真的,那是硬核的东西。谢谢,我相信它会很有用
      • 哦,哈哈.. 抱歉误会。 Ruby 使用 $LOAD_PATH 变量来搜索它的库。操作它的唯一方法是在脚本本身中,除非您修改 Ruby 源代码 :-P 如果您碰巧找到一种方法,请告诉我!
      • ruby -e 'puts $LOAD_PATH' 将为您提供所有默认库目录。要在不进行任何额外输入的情况下全局使用您的库,您确实需要将其放在其中一个文件夹中。
      猜你喜欢
      • 2011-09-22
      • 2011-03-10
      • 1970-01-01
      • 2016-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-31
      • 1970-01-01
      相关资源
      最近更新 更多