如何通过自制软件分发 ruby 脚本
how to distribute a ruby script via homebrew
如何通过自制软件部署简单的 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
require' from /usr/local/bin/foo
$ which foo
/usr/local/bin/foo
我怀疑是因为 /usr/local/bin/foo/lib/libfile1.rb
处没有 .rb 文件
有什么想法是正确的做法吗?
我找到了我自己的问题的答案,实际上这是网上某人使用的技术,基本上是这样做的
#!/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
您的脚本有两个问题:
第一个是你尝试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
脚本。
如何通过自制软件部署简单的 ruby 脚本?
这是我试过的
在名为 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' from /usr/local/bin/foo
$ which foo
/usr/local/bin/foo
我怀疑是因为 /usr/local/bin/foo/lib/libfile1.rb
有什么想法是正确的做法吗?
我找到了我自己的问题的答案,实际上这是网上某人使用的技术,基本上是这样做的
#!/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
您的脚本有两个问题:
第一个是你尝试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
脚本。