如何通过自制软件分发ruby脚本

时间:2017-07-16 16:45:29

标签: ruby homebrew optparse thor load-path

如何通过自制软件部署简单的ruby脚本?

这是我尝试过的事情

在名为homebrew-foo

的GitHub仓库中写了公式
# file https://github.com/foo/homebrew-foo/blob/master/foo.rb
class Foo < Formula
  desc "A command line tool"
  url "https://github.com/foo/foo/archive/master.zip"
  version "5.0.1"

  def install
    bin.install "foo"
    lib.install Dir["lib/*"]
  end
end

另一个存储库包含ruby脚本。这些是文件

./foo
./lib/libfile1.rb

这里是脚本的作用

#!/usr/bin/env ruby
require './lib/libfile1.rb'
puts "came here"

问题在于require失败。

$ brew install foo/foo/foo
$ foo

导致此错误

  

/Users/user1/.rbenv/versions/2.4.1/lib/ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in   require': cannot load such file -- ./lib/libfile1.rb (LoadError) from /Users/user1/.rbenv/versions/2.4.1/lib/ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in 需要&#39;来自/ usr / local / bin / foo

$ which foo
/usr/local/bin/foo

我怀疑它是因为。{1}}

上没有.rb文件

任何想法都有正确的方法吗?

2 个答案:

答案 0 :(得分:1)

您的脚本存在两个问题:

第一个是你尝试require相对于当前目录的某个文件;即运行脚本的那个,它所在的那个。可以使用Ruby’s require_relative修复该问题:

#!/usr/bin/env ruby
require_relative './lib/libfile1.rb'
puts "came here"

第二个问题是脚本假定lib/目录位于其目录中;这不是因为你的公式安装了<prefix>/bin/下的脚本和<prefix>/lib/下的库文件。 Homebrew有一个名为Pathname#write_exec_script的用例帮助器。它允许您在一个目录下安装所需的所有内容,然后在调用脚本的bin/下创建一个可执行文件。

您的公式现在看起来像这样:

class Foo < Formula
  desc "A command line tool"
  url "https://github.com/foo/foo/archive/master.zip"
  version "5.0.1"

  def install
    libexec.install Dir["*"]
    bin.write_exec_script (libexec/"foo")
  end
end

它会安装libexec/下的所有内容(lib/通常是为lib文件保留的),然后在bin/下添加一个可调用libexec/foo脚本的可执行文件。

答案 1 :(得分:0)

我找到了自己问题的答案,实际上这是网上有人使用的一种技术,基本上就是做这样的事情

#!/usr/bin/env ruby
DBMGR_HOME = File.expand_path('../..', __FILE__)
$LOAD_PATH.unshift(File.join(DBMGR_HOME, 'lib'))
require 'dbmgr'

配方可以是这样的:

https://github.com/callahanrts/homebrew-dbmgr/blob/master/dbmgr.rb