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

如何通过自制软件部署简单的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:inrequire': 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 / usr / local / bin / foo

 $ which foo /usr/local/bin/foo 

我怀疑是因为/usr/local/bin/foo/lib/libfile1.rb没有.rb文件

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

您的脚本有两个问题:

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

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

第二个问题是脚本假定lib/目录位于其目录中; 这不是因为你的公式安装了

/bin/下的脚本和/lib/下的库文件。 Homebrew有一个名为Pathname#write_exec_script用例的帮助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脚本。

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

 #!/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