【问题标题】:Ruby Gem command line toolRuby Gem 命令行工具
【发布时间】:2023-03-26 01:38:01
【问题描述】:

我正在尝试构建一个命令行。我正在使用 bundler 创建 gem 并在本地安装 gem。它生成了所需的目录。我还能够测试,如果我需要我的 Gem,我可以在其中使用方法。我正在尝试让命令行部分现在可以正常工作,但似乎无法正常工作。我希望能够做类似的事情

gemname command

类似于 的工作方式:

rspec test/whatever.rb

任何关于如何通过命令行执行的帮助都会很棒。

【问题讨论】:

  • 你必须自己实现二进制/命令行工具。示例见github.com/jimweirich/rake/tree/master/bin
  • 你能再解释一下吗?所以我创建了那个可执行文件,然后运行 ​​bundle install 它应该可以工作吗?此外,当它执行 Rake.application.run 时,它是否特定于 rake 命令?我的 Gem 中需要它吗?当我运行 mygem mycommand 它只是说 command not found mygem

标签: ruby gem rspec ruby-on-rails ruby gem


【解决方案1】:

为了声明可执行文件,您只需在 yourgem.gemspec 中添加适当的一行:

`git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }

此行以及其他有用的行是由bundle gem yourgem 命令生成的。只需执行它,然后根据您的需要修复 yourgem.gemspec。将可执行文件放入 gem 的 bin/ 文件夹,将所有库(包括版本)放入 lib/ 文件夹。

下一步是使用二进制文件。当您将 安装到系统中时,二进制文件夹会自动包含在二进制搜索路径中。因此,您的 gem 可以从任何地方执行。但是,当您的 gem 没有安装时,您仍然可以使用 的 exec 来模拟这种情况,如下所示:

 bundle exec bin/your_exec

它从 lib/ 文件夹中提取所需的库,并且可执行文件将正常工作。

为确保可执行文件能够正常工作,请使用gem build yourgem.gemspec 构建gem,然后使用gem install yourgem.gem 安装它,然后尝试。

【讨论】:

  • 好的,所以当我使用 bundle exec bin/my_exec 时这似乎有效。所以当我发布这个你说的用户将能够运行 mygemname mycommand?在将其发布到 ruby​​gems 之前,我可以在本地进行测试吗?
  • @wallerjake 当然构建 gem gem build yourgem.gemspec,然后安装它gem install yourgem.gem
  • 是的,它说它已安装,但是当我输入我的 gemname mycommand 时,它说 gemname not found。成功安装 gemname-0.0.1 gemname-0.0.1 的解析文档 为 gemname-0.0.1 安装 ri 文档 1 个 gem 已安装
  • 现在我得到了这个捆绑器:找不到命令:gemname 使用 bundle install 安装缺少的 gem 可执行文件
  • @wallerjake 好的,只显示bundle show gemname => /path/to/gemname 然后ls /path/to/gemname/bin
【解决方案2】:

我认为问题在于您尚未提交代码。 检查git ls-files -- bin/* 是否显示您要执行的脚本。

当您提交文件时,git ls-files 将返回它,规范将能够加载脚本。

【讨论】:

  • 我认为@Малъ Скрылевъ 的answer 指向同一个方向。他的功劳!
  • 是的,我相信你是对的。我暂时离开了它,但我打算回来再次更新。谢谢!
【解决方案3】:

查看这些博客文章: http://robdodson.me/blog/2012/06/14/how-to-write-a-command-line-ruby-gem/ http://rubylearning.com/blog/2011/01/03/how-do-i-make-a-command-line-tool-in-ruby/

我不太确定到目前为止您构建了什么,但这里有一些兴趣点:

  1. #!/usr/bin/env ruby 用于可执行文件中的第一行(在/bin 文件夹中)。
  2. chmod +x filname 使其可执行
  3. ARGV[0] 传入的变量是从ARGV[0] 检索的
  4. s.executables << 'your_file' 将可执行文件添加到 gemspec

【讨论】:

  • 好吧,看来我可以运行 bin/mycommand 但不能运行 gemname mycommand 是这样的吗?我需要配置一些东西才能运行 gemname mycommand 吗?
  • 添加了executables 行。试试看
  • 这就是 bundle gem 给我的。 spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } 这不正确吗?我应该尝试将特定文件放在适当的位置吗?我还需要重新加载 Gem 进行捆绑安装吗?
【解决方案4】:

至少对于我的具体问题,我想出了这一点。我只需要直接调用 bin 命令而不是 git ls 循环。由于某种原因,顶部的有效,底部的无效。

spec.executables = ["toolshed"]

spec.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多