2

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

这是我尝试过的

在名为的 GitHub 存储库中编写公式homebrew-foo

# 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 require' 来自 /usr/local/bin/foo

$ which foo
/usr/local/bin/foo

我怀疑这是因为 .rb 文件不在/usr/local/bin/foo/lib/libfile1.rb

任何想法是什么正确的方法来做到这一点?

4

2 回答 2

3

您的脚本有两个问题:

第一个是你尝试require一些相对于当前目录的文件;即运行脚本的那个,而不是它所在的那个。这个问题可以通过使用Rubyrequire_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脚本的下面添加一个可执行文件。

于 2017-07-19T09:57:41.160 回答
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
于 2017-07-16T20:32:22.130 回答