是否有一种既定的方法可以使用 rubygems 分发非 ruby 脚本?

Is there like an established way of distributing non-ruby scripts with rubygems?

如果我将 bash 脚本作为可执行文件添加到 gem 中,安装 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?() then
    version = 
    ARGV.shift
  end
end

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

这使它功能失调,因为 ruby 翻译器显然不会说话 bash。

有什么好的处理方法?我可以关闭包装吗(最好,因为 bash 的启动速度比 YARV ruby 解释器快大约 12 倍),还是我需要将我的 bash 包装在 ruby 中为了让生成的负载包装器满意?

我在 rubygem 存储库的 ticket discussions.

之一中找到了以下答案

我不知道有什么好的方法可以跨平台工作并且有意义。 Rubygems 用于 ruby。如果一个文件在你的 gem 的 bindir 中并且被列为 gem 可执行文件,它应该是 ruby。如果你的 gem 有 "special needs" 那么它应该带外做,比如创建一个 Rakefile 来为你执行特殊步骤,并将 Rakefile 作为扩展名列在规范中。或者只是使用 post-install 消息告诉人们使用 --no-wrapper.

安装

我还在rubygems specification documentation中发现了以下评论。

# # 例如,rake gem 将 rake 作为可执行文件。你没有指定 # 完整路径(如 bin/rake);所有应用程序样式的文件都应该是 - # 在 bindir 中找到。 + # 在 bindir 中找到。这些文件必须是可执行 ruby 文件。文件 + # 使用 bash 否则其他解释器将不起作用。 #

希望这些信息对您有所帮助。