【问题标题】:How should I structure my ruby gem command line service?我应该如何构建我的 ruby​​ gem 命令行服务?
【发布时间】:2012-03-27 07:36:33
【问题描述】:

我正在编写一个 ruby​​ gem,用户可以安装它并使用命令行 ruby​​ 工具与服务进行交互。您可以启动和停止该服务(它将产生一个子进程)。

我已经对用于编写网络服务的最佳方法进行了大量研究,例如 ØMQ/EventMachine,并且我了解了如何创建一个 Ruby gem 来安装可以在命令行中使用的二进制文件,但我正在努力制定一个好的代码结构。

我的命令行实用程序将接受各种参数(我将使用Trollop),它将使用各种类来做事,并使用各种其他 ruby​​ gem。

我不确定我应该把我的类文件放在哪里,以及如何在我的二进制文件中要求它们以便路径正确。

【问题讨论】:

    标签: ruby rubygems command-line-interface network-service


    【解决方案1】:

    很大程度上,RubyGems 会为您解决这个问题。您需要将您的可执行文件包含在files 列表中,并将其放入您的gemspec 中的executables。通常将您的可执行文件放在目录中的bin 中,例如:

    $ ls
    bin/   myapp.gemspec  lib/    Rakefile
    $ ls bin
    bin/myapp
    

    您的 gemspec 将如下所示:

    Gem::Specification.new do |s|
      s.name = 'myapp'
    
      # whatever else is in your gemspec
    
      s.files = ["bin/myapp","lib/myapp.rb"]  # or whatever other files you want
      s.executables = ["bin/todo"] 
    end
    

    此时,当用户通过 RubyGems 安装您的应用程序时,myapp 将在他们的路径中,lib 将在您应用程序的加载路径中,因此您的可执行文件可以简单地开始:

    #!/usr/bin/env ruby
    
    require 'myapp'
    # whatever other requires
    

    唯一的问题是,在开发过程中,您不能只执行bin/myapp 并让您的应用程序运行。一些开发人员通过$:$LOAD_PATH 操纵加载路径,但这被认为是错误的形式。

    如果您使用的是 bundler,最简单的方法是使用 bundle exec 在本地运行您的应用程序,例如bundle exec bin/myapp。您可以交替使用 RUBYLIB 环境变量,例如RUBYLIB=lib bin/myapp,这会将lib 放入加载路径。

    【讨论】:

      【解决方案2】:

      您可以使用Bundler 生成gem 项目结构。

      简单地说:

      安装捆绑器

      $ gem install bundler
      

      使用 Bundler 生成 gem 项目

      $ bundle gem myapp
      $ cd myapp
      

      添加可执行文件

      $ mkdir bin
      $ cat > bin/mycommand << EOSCRIPT
        #!/usr/bin/env ruby
      
        require 'myapp'
      
        puts "Executing myapp"
        EOSCRIPT
      $ chmod +x bin/mycommand
      

      安装您的 Gem

      $ rake install
      

      运行您的脚本

      $ mycommand
      Executing mycommand
      

      在 ruby​​gems.org 上分享您的实用程序

      $ rake release
      

      更多文档请访问the website

      【讨论】:

        【解决方案3】:

        由于所有宝石本质上都是开源的,因此您可以随时查看一些更好的示例。使用像 jewelerhoe 这样的 gem 构建器也可以为您设置一些组织上的基本结构。

        【讨论】:

        • “来源可用”可能是一个更好的术语。仅仅因为你可以看到源代码并不意味着它是通常意义上的“开源”软件。
        • 谢谢,我会看看那些!我白天不是 ruby​​ 开发人员,所以我很难站稳脚跟。
        • 我的意思是更多的“开源”,因为我不知道任何被故意混淆的东西。这就是“开源”和“免费开源”的不同之处。尽管如此,绝大多数 Gem 都是通过某种开源许可发布的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-20
        • 2023-03-26
        • 2023-02-07
        相关资源
        最近更新 更多