有没有像使用rubygems分发非ruby脚本的既定方法?

时间:2015-05-31 12:58:08

标签: ruby rubygems

如果我在gem中添加一个bash脚本作为可执行文件,安装gem会导致可执行文件包含在以下内容中:

#!/usr/bin/env ruby_executable_hooks
#
# This file was generated by RubyGems.
#
# The application 'my_bash_script' is installed as part of a gem, and
# this file is here to facilitate running it.
#

require 'rubygems'

version = ">= 0.a"

if ARGV.first
  str = ARGV.first
  str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
  if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then
    version = $1
    ARGV.shift
  end
end

gem 'my_bash_script', version
load Gem.bin_path('my_bash_script', 'my_bash_script', version)

这使得它功能失调,因为红宝石翻译显然不会说bash。

处理这个问题的好方法是什么?我可以关闭包装(最好,因为bash的启动速度比YARV ruby​​解释器快12倍),还是我需要将我的bash包装在ruby中以便生成的加载包装器满意?

1 个答案:

答案 0 :(得分:1)

我在其中一个rubygem repo的ticket discussions中找到了以下答案。

我不知道一个很好的方法可以跨平台工作并且有意义。 Rubygems适用于ruby。如果文件在gem的bindir中并列为gem可执行文件,那么它应该是ruby。如果您的宝石有特殊需求"然后它应该在带外执行,比如创建一个Rakefile,为您执行特殊步骤并将Rakefile列为规范中的扩展名。或者只是使用安装后消息告诉人们使用--no-wrapper安装。

我还在rubygems specification documentation找到了以下评论。

#    #例如,rake gem将rake作为可执行文件。你没有指定    #完整路径(如bin / rake中所示);所有应用程序风格的文件都应该是 - 在bindir中找到#。 +#在bindir中找到。这些文件必须是可执行的ruby文件。文件 +#使用bash或其他解释器将无法正常工作。    #

希望这些信息有所帮助。